原题链接 :http://poj.org/problem?id=3268
分析:
题意分析:有N个农村,每个农场一头牛,现在每头牛都要去同一个农场X,然后再回到各自的农场。它们每次去和回的时候都是走最短路径。问那头牛一去一回的时间最长,输入这个最长时间。
算法分析:用SPFA算法求最短路,开两个map数组记录关系(一个正向,一个反向),同意的要两个dis数组。
我的代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define INF 0xfffffff
#define MAXN 1005
//建两个图。就可以解决方向问题。
typedef long long LL;
int map1[MAXN][MAXN];
int map2[MAXN][MAXN];
int n,m,x;
int dis1[MAXN];
int dis2[MAXN];
void SPFA(int x,int map[MAXN][MAXN],int *dis)
{
queue<int > Q;
bool vis[MAXN]={false};
Q.push(x);
vis[x]=true;
dis[x]=0;
while(!Q.empty()){
int t=Q.front();
Q.pop();
vis[t]=false;
for(int i=1;i<=n;i++){
if(map[t][i]!=INF&&dis[i]>dis[t]+map[t][i])
{
dis[i]=dis[t]+map[t][i];
if(!vis[i])
{
vis[i]=true;
Q.push(i);
}
}
}
}
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&x))
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++) map2[i][j]=map1[i][j]=INF;
for(int i=0;i<m;i++){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
map1[a][b]=v;
map2[b][a]=v;
}
for(int i=0;i<MAXN;i++) dis2[i]=dis1[i]=INF;
int ans=0;
SPFA(x, map1,dis1);
SPFA(x, map2,dis2);
for(int i=1;i<=n;i++) dis1[i]+=dis2[i];
for(int i=1;i<=n;i++) if(ans<dis1[i]) ans=dis1[i];
printf("%d\n",ans);
}
return 0;
}
总结:唉呀呀,好久没打最短路了,宝刀未老呀o(≧v≦)o~~