首页 > 代码库 > UVa1599,Ideal Path
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+5using 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"); }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。