UVA1599IdealPath

//UVA1599IdealPath(3)
#include
#include
#include
#include
#include
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 edges;
vector 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 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 ans;
	int vis[MAXN] = {0};
	vis[0] = true;
	vector 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 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 6
1 2 1
1 3 2
3 4 3
2 3 1
2 4 4
3 1 1

*/

你可能感兴趣的:(数据结构,UVA)