您的位置:首页 > 其它

POJ 3268 Silver Cow Party bfs最短路

2015-04-18 22:29 399 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66569#problem/D

题意:cows要举办一个party,地点选择其中一个cow的位置,其他cow去参加,需要沿着单向边走一个来回,求他们的最小来回路程中的最大的值。

刚开始天真的写了N多个DFS,然后各种WA,只好放弃了,然后改写BFS,然后AC,然后就没有然后了,看来最短路还是写成BFS吧、。。。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define INF 0x7fffffff

using namespace std;

struct edge{
int u,v,w;
}E[100010];

int N,M,X;
vector<int> G[2][1010];
int ans[2][1010],vis[1010];

void bfs(int op){//op为0时正向更新v,op为1时反向更新u
memset(vis,0,sizeof(vis));
for(int i=1;i<=N;i++) ans[op][i]=INF;
queue<int> Q;
Q.push(X);
vis[X]=1;ans[op][X]=0;
while(!Q.empty()){
int tp=Q.front();Q.pop();vis[tp]=0;
for(int i=0;i<(int)G[op][tp].size();i++){
int t=G[op][tp][i];
int u=E[t].u,v=E[t].v,w=E[t].w;
if(op) swap(u,v);//反向更新最小值
if(ans[op][u]+w>=ans[op][v]) continue;
ans[op][v]=ans[op][u]+w;
if(!vis[v]) vis[v]=1,Q.push(v);
}
}
}

int main(){
freopen("D:\\in.txt","r",stdin);
while(cin>>N){
cin>>M>>X;
int a,b,c;
for(int i=0;i<=N;i++) G[0][i].clear(),G[1][i].clear();
for(int i=0;i<M;i++){
scanf("%d %d %d",&a,&b,&c);
E[i]=(edge){a,b,c};
G[0][a].push_back(i);//以a出发的边
G[1][b].push_back(i);//指向b的边
}
bfs(0);bfs(1);
int Max=0;
for(int i=1;i<=N;i++) {
Max=max(Max,ans[0][i]+ans[1][i]);
}
cout<<Max<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: