#include<bits/stdc++.h> using namespace std; typedef pair<int,int>Pair; const int maxn = 100000 + 3; int n, m; vector<Pair>G[maxn]; int d[maxn]; bool vis[maxn]; void bfs1() { memset(vis, 0, sizeof(vis)); queue<int>q; q.push(n); vis[n] = true; d[n] = 0; while(!q.empty()){ int u = q.front(); q.pop(); if(u == 1){ break; } for(int i = 0; i < G[u].size(); i++){ int v = G[u][i].first; if(!vis[v]){ q.push(v); vis[v] = true; d[v] = d[u] + 1; } } } } vector<int>best_colors; void digui(int u, vector<int>cur_colors) { int cur_d = d[u]; if(u == n){ for(int i = 0; i < d[1]; i++){ if(cur_colors[i] < best_colors[i]){ best_colors = cur_colors; break; } } return; } for(int i = 0; i < G[u].size(); i++){ int v = G[u][i].first; if(d[v] == cur_d - 1){ cur_colors.push_back(G[u][i].second); digui(v, cur_colors); cur_colors.pop_back(); } } } void solve() { memset(d, -1, sizeof(d)); bfs1(); for(int i = 0; i < d[1]; i++){ best_colors.push_back(INT_MAX); } vector<int>cur_colors; digui(1, cur_colors); //输出 cout << d[1] << endl; cout << best_colors[0]; for(int i = 1; i < d[1]; i++) cout << " " << best_colors[i]; cout <<endl; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(cin >> n >> m && n){ for(int i = 0; i < m; i++){ int u, v, color; cin >> u >> v >> color; G[u].push_back(make_pair(v, color)); G[v].push_back(make_pair(u, color)); } solve(); } return 0; }
原文:https://www.cnblogs.com/sanshi-2018/p/10440331.html