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;
}
相关推荐
赛姐在努力.2 天前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
elseif1234 天前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
我爱工作&工作love我4 天前
P4913 【深基16.例3】二叉树深度 dfs-二叉树的遍历
算法·深度优先·图论
拼好饭和她皆失6 天前
图论:最小生成树,二分图详细模板及讲解
c++·算法·图论
颢珂智库Haokir Insights7 天前
离散数学 (Discrete Mathematics) 的数学模型示例:图论 (Graph Theory)
图论
仰泳的熊猫7 天前
题目1433:蓝桥杯2013年第四届真题-危险系数
数据结构·c++·算法·蓝桥杯·深度优先·图论
燃于AC之乐8 天前
《算法实战笔记》第10期:六大算法实战——枚举、贪心、并查集、Kruskal、双指针、区间DP
算法·贪心算法·图论·双指针·区间dp·二进制枚举
北温凉8 天前
EEG 有效连接分析(基于 MVGC 与图论)
图论·eeg·mvgc·脑功能连接
仰泳的熊猫8 天前
题目1432:蓝桥杯2013年第四届真题-剪格子
数据结构·c++·算法·蓝桥杯·深度优先·图论
一条大祥脚9 天前
ABC357 基环树dp|懒标记线段树
数据结构·算法·图论