1599 - Ideal Path (UVA)

题目链接如下:

https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=448&page=show_problem&problem=4474

这道题也是看了刘汝佳的思路才写出来的....

代码如下:

cpp 复制代码
#include <cstdio>
#include <deque>
#include <vector>
#include <algorithm>
#include <map>
const int maxx = 100005;
const int maxColor = 1e9 + 1;
// #define debug

struct node{
    int id, color;
    node(int _id, int _color): id(_id), color(_color){}
};
int n, m, u, v, c, k, curr, minn;
std::map<int, std::vector<node>> mp;
int d[maxx], pre[maxx], preColor[maxx];
bool vis[maxx];

void bfs1(){
    std::deque<int> dq;
    dq.push_back(n);
    d[n] = 0;
    vis[n] = true;
    while (!dq.empty()){
        curr = dq.front();
        dq.pop_front();
        for (int i = 0; i < mp[curr].size(); ++i){
            int temp = mp[curr][i].id;
            if (!vis[temp]){
                d[temp] = d[curr] + 1;
                vis[temp] = true;
                dq.push_back(temp);
            }
        }
    }
}

void bfs2(){
    std::deque<int> dq;
    dq.push_back(1);
    while (!dq.empty()){
        curr = dq.front();
        dq.pop_front();
        minn = maxColor;
        for (int i = 0; i < mp[curr].size(); ++i){
            int temp = mp[curr][i].id;
            if (d[temp] == d[curr] - 1){
                minn = std::min(minn, mp[curr][i].color);
            }
        }
        for (int i = 0; i < mp[curr].size(); ++i){
            int temp = mp[curr][i].id;
            if (d[temp] == d[curr] - 1 && mp[curr][i].color == minn){
                if (!pre[temp]){
                    dq.push_back(temp);
                }
                if (!pre[temp] || preColor[temp] > minn){
                    pre[temp] = curr;
                    preColor[temp] = minn;
                }
            }
        }
    }
}

int main(){
    #ifdef debug
    freopen("0.txt", "r", stdin);
    freopen("1.txt", "w", stdout);
    #endif
    while (scanf("%d %d", &n, &m) == 2){
        mp.clear();
        std::fill(d, d + n + 1, -1);
        std::fill(vis, vis + n + 1, false);
        std::fill(pre, pre + n + 1, 0);
        std::fill(preColor, preColor + n + 1, -1);
        while (m--){
            scanf("%d %d %d", &u, &v, &c);
            if (u != v){
                mp[u].push_back(node(v, c));
                mp[v].push_back(node(u, c));
            }
        }
        bfs1();
        bfs2();
        std::vector<int> path;
        curr = n;
        do {
            path.push_back(preColor[curr]);
            curr = pre[curr];
        } while (curr != 1);
        reverse(path.begin(), path.end());
        printf("%d\n", path.size());
        for (int i = 0; i < path.size(); ++i){
            printf("%d%s", path[i], i == path.size() - 1 ? "\n" : " ");
        }
    }
    #ifdef debug
    fclose(stdin);
    fclose(stdout);
    #endif
    return 0;
}
相关推荐
依然鸣11 小时前
蓝桥杯多校模拟赛(第二场)题解
数据结构·c++·经验分享·学习·算法·图论
wabs66612 小时前
关于图论【Kruskal算法|卡码网53.寻宝的思考】
数据结构·算法·图论·卡码网
qz5zwangzihan13 天前
题解:Atcoder Beginner Contest abc469 F - GCD Maximum Spanning Tree
c++·图论·kruskal·并查集·atcoder·abc469·abc469_f
wabs6663 天前
关于图论【卡码网108.多余的边的思考】
数据结构·算法·图论
漂流瓶jz4 天前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
wabs6664 天前
关于图论【卡码网107.寻找存在的路线的思考】
数据结构·算法·图论
一条大祥脚5 天前
26杭电暑期第三场 DP|费用流|分解质因子|数论|贪心|图论|期望|无穷级数
网络·图论·网络流·无穷级数·费用流
wabs6666 天前
关于图论【卡码网105.有向图的完全联通的思考】
数据结构·算法·图论
wabs6667 天前
关于图论【卡码网110.字符串迁移的思考】
数据结构·算法·图论
oier_Asad.Chen7 天前
【洛谷题解/AcWing题解】洛谷P4011 孤岛营救问题/AcWing1131拯救大兵瑞恩
数据结构·笔记·学习·算法·动态规划·图论·宽度优先