UVa1599,Ideal Path
说实话,这题参考的:
http://blog.csdn.net/u013382399/article/details/38227917
倒着BFS就把我难住了T T,原来这样倒着BFS一遍,遍历完所有的点后就能得到每一点到终点的最短距离啊(其实做完反思后仔细想了想,发现其实当第一次bfs到首节点时,该图已经遍历完成了),一开始没转过这个弯来T T,我直接调用了N次dfs(i)囧rz....
一开始我还想着吧color[]排序...这样更费时.....我写的dfs2()写着写着就乱了,本来思路还清晰,结果越写越乱T T...然后直接看的他的dfs2()
哎,和人家还有很大差距啊......虽然几乎是直接copy的人家的代码,但是做了深刻的反思,也深度的学习了他的代码与方法,算是学到了一些东西吧, 嘻嘻……至少比自己空领悟节约点时间嘛
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> #include <vector> #include <queue> #define maxn 100000+5 using namespace std; vector<int> g[maxn]; vector<int> c[maxn]; int n,m,vis[maxn],d[maxn],ans[maxn]; int init(){ int x,y; int temp; memset(vis,0,sizeof(vis)); memset(d,0,sizeof(d)); memset(ans,0,sizeof(ans)); for (int i=0;i<=n;i++)g[i].clear(); for (int i=0;i<=n;i++)c[i].clear(); for (int i=0;i<m;i++){ cin>>x>>y; g[x].push_back(y); g[y].push_back(x); cin>>temp; c[x].push_back(temp); c[y].push_back(temp); } } void bfs1(int n) { memset(d,-1,sizeof(d)); queue<int> q; d[n]=0; q.push(n); while(!q.empty()) { int u=q.front();q.pop(); int sz=g[u].size(); for(int v=0;v<sz;v++) { int vv=g[u][v]; if(vv==1) { d[1]=d[u]+1; return; } if(d[vv]==-1) { d[vv]=d[u]+1; q.push(vv); } } } return; } void bfs2() { memset(vis,0,sizeof(vis)); queue<int> q; q.push(1); while(!q.empty()) { int u=q.front();q.pop(); if(d[u]==0) return; int sz=g[u].size(); int mm=-1; for(int i=0;i<sz;i++)//找到最小的颜色 { int vv=g[u][i]; if(d[vv]==d[u]-1) { if(mm==-1) mm=c[u][i]; else mm=min(mm,c[u][i]); } } int t=d[1]-d[u]; if(ans[t]==0) ans[t]=mm; else ans[t]=min(mm,ans[t]); for(int v=0;v<sz;v++) { int vv=g[u][v]; if(vis[vv]==0&&d[vv]==d[u]-1&&c[u][v]==mm) { q.push(vv); vis[vv]=1; } } } return; } int main() { while (cin>>n>>m){ init(); bfs1(n); bfs2(); printf("%d\n",d[1]); for(int i=0;i<d[1];i++) { if(i) printf(" "); printf("%d",ans[i]); } printf("\n"); } }