poj3268
题目名称:Silver Cow Party
题目链接:http://poj.org/problem?id=3268
题意:有n个农场和m条单向的路和每条路通过所要的时间,除X外其他农场的牛都来X农场开party,结束都各自回家,问所有牛各自所花最短时间中 那个最大的时间是多少
思路:先正着求最短路然后再反过来求一次
代码如下:
#include<cstdio> #include<cstring> #include<string> #include<iostream> #include<queue> #include<vector> using namespace std; const int INF=0x3f3f3f3f; const int maxn=1001; int dis[maxn][maxn]; int d[maxn]; bool inque[maxn]; vector<int> vr[maxn]; int n,m,x; void spfa() { memset(inque,false,sizeof(inque)); queue<int> Q; Q.push(x); inque[x]=true; d[x]=0; while(!Q.empty()) { int u=Q.front(); Q.pop(); inque[u]=false; for(int v=1;v<=n;v++) { if(d[v]>d[u]+dis[u][v]) { d[v]=d[u]+dis[u][v]; if(!inque[v]) { inque[v]=true; Q.push(v); } } } } } void Traverse() { int i,j,tmp; for(i=1;i<=n;i++) { for(j=1;j<i;j++) { tmp=dis[i][j]; dis[i][j]=dis[j][i]; dis[j][i]=tmp; } } } int main() { while(scanf("%d%d%d",&n,&m,&x)!=EOF) { int u,v,w; int dist[maxn]; memset(dis,INF,sizeof(dis)); memset(d,INF,sizeof(d)); for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); if(w<dis[u][v]) { dis[u][v]=w; } } spfa(); //求去X的最短路 for(int i=1;i<=n;i++) { dist[i]=d[i]; } Traverse(); //反转 memset(d,INF,sizeof(d)); spfa(); //求回家的最短路 int sum=0; for(int i=1;i<=n;i++) { sum=max(sum,d[i]+dist[i]); } printf("%d\n",sum); } return 0; }
本文版权归作者本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.