1599

来源:互联网 发布:绘画截屏软件 编辑:程序博客网 时间:2024/05/21 21:45

紫书上面已经给出了很好的思路,首先从终点开始进行BFS,同时记录从终点开始到每个节点的最短路径的长度,这样一直到起点,然后从起点开始进行新的一轮的BFS,在新的一轮的BFS中,我们要记录所走路径的颜色信息,每次选择颜色最小的那一条路来走,同时要注意,如果从当前的节点开始有多条颜色最小的路径,那么我们要将相应节点的编号都要存到队列当中,在下一轮的时候依次出队列分别进行下一轮的比较,保证所走的路径的颜色值是字典序最小的,具体实现见如下源代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>using namespace std;int n, m;void bfs1(vector<int>& distance,vector<vector<int>>& point){distance[n] = 0;queue<int> q;q.push(n);while (!q.empty()){int t = q.front();q.pop();for (int i = 0; i < point[t].size(); i++){int next = point[t][i];if (distance[next] == -1){distance[next] = distance[t] + 1;q.push(next);if (next == 1) return;}}}}void bfs2(vector<vector<int>>& point,vector<vector<int>>& color,vector<int>& distance,vector<int>& ans,vector<bool>& visit){queue<int> q;q.push(1);while (!q.empty()){int t = q.front();if (t == n) return;q.pop();int min_color = 2147483647;for (int i = 0; i < point[t].size(); i++){int cur = point[t][i];if (distance[t] == distance[cur] + 1 && min_color > color[t][i]) min_color = color[t][i];}if (ans[distance[t]] == 0 || ans[distance[t]] >= min_color) ans[distance[t]] = min_color;else continue;for (int i = 0; i < point[t].size(); i++){int cur = point[t][i];if (distance[t] == distance[cur] + 1 && min_color == color[t][i] && !visit[cur]) {q.push(cur); visit[cur]=true;}}}}int main(){while (cin >> n >> m){vector<vector<int>> point(n+1,vector<int>());vector<vector<int>> color(n+1,vector<int>());for (int i = 0; i < m; i++){int a, b, c;cin >> a >> b >> c;point[a].push_back(b);point[b].push_back(a);color[a].push_back(c);color[b].push_back(c);}vector<bool> visit(n + 1, false);vector<int> distance(n+1,-1);bfs1(distance, point);vector<int> ans(distance[1]+1,0);bfs2(point, color, distance, ans, visit);int i = distance[1];cout << distance[1] << endl;while (true){cout << ans[i];i--;if (i == 0){cout << endl;break;}else{cout << " ";}}}return 0;}

原创粉丝点击