UVA1599IdealPath

来源:互联网 发布:步惊云软件 编辑:程序博客网 时间:2024/06/12 21:58
//UVA1599IdealPath(3)#include<cstdio>#include<cstdlib>#include<cstring>#include<vector>#include<queue>using namespace std;const int MAXN = 1e5 + 10;const int INF = 1e9 + 10;int m, n;struct edge {int u, v, c;edge(int u = 0, int v = 0, int c = 0) : u(u), v(v), c(c) {}};vector<edge> edges;vector<int> G[MAXN];void addedge(int a, int b, int e) {edges.push_back(edge(a, b, e));int idx = edges.size() - 1;G[a].push_back(idx);}int d[MAXN] = {0};void rev_bfs() {int vis[MAXN] = {0};d[n - 1] = 0;vis[n - 1] = true;queue<int> q;q.push(n - 1);while(!q.empty()) {int tmp = q.front(); q.pop();for(int i = 0; i < G[tmp].size(); i++) {int e = G[tmp][i];int v = edges[e].v; if(!vis[v]) {vis[v] = true;d[v] = d[tmp] + 1;    q.push(v);}}}printf("%d\n", d[0]);}void bfs() {vector<int> ans;int vis[MAXN] = {0};vis[0] = true;vector<int> next;next.push_back(0);for(int i = 0; i < d[0]; i++) {int min_color = INF;for(int j = 0; j < next.size(); j++) {int u = next[j];for(int k = 0; k < G[u].size(); k++) {int e = G[u][k];int v = edges[e].v;if(d[v] == d[u] - 1) {min_color = min(min_color, edges[e].c);}}}    ans.push_back(min_color);vector<int> next2;for(int j = 0; j < next.size(); j++) {int u = next[j];for(int k = 0; k < G[u].size(); k++) {int e = G[u][k];int v = edges[e].v;if(!vis[v] && d[v] == d[u] - 1 && edges[e].c == min_color) {next2.push_back(v); vis[v] = true;}  }}next = next2;}printf("%d", ans[0]);for(int i = 1; i < ans.size(); i++) printf(" %d", ans[i]);printf("\n");}int main() {    while(scanf("%d%d", &n, &m) == 2) {for(int i = 0; i < n; i++) G[i].clear();edges.clear();memset(d, 0, sizeof(d));int a, b, e;while(m--) {scanf("%d%d%d", &a, &b, &e);addedge(a - 1, b - 1, e);addedge(b - 1, a - 1, e);}rev_bfs();bfs();}return 0;}/*4 61 2 11 3 23 4 32 3 12 4 43 1 1*/