迪杰斯特拉,算法,题意理解了就好了:N个农场的牛去 K 农场打牌,打完牌再从K农场回到各自的农场,问一来一回过程中走路最长的牛(牛选择最短路走)。然后一个正的最短路,一个反的最短路 就ok了。
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<string>
#include<math.h>
#include<queue>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<cmath>
#define INF 0x3f3f3f3f
#define MAX 1005
using namespace std;
int Map[MAX][MAX],vis[MAX],Go[MAX],Back[MAX],k,n,m;
void Godij()
{
memset(vis,0,sizeof(vis));
int i,j,t,minn;
for(i=1; i<=n; i++)
Go[i]=Map[k][i];
vis[k]=1;
for(i=1; i<n; i++)
{
minn=INF;
for(j=1; j<=n; j++)
{
if(Go[j] < minn && !vis[j])
{
minn=Go[j];
t=j;
}
}
vis[t]=1;
for(j=1; j<=n; j++)
{
if(Go[j] > Go[t]+Map[t][j])
Go[j]=Go[t]+Map[t][j];
}
}
}
void Backdij()
{
memset(vis,0,sizeof(vis));
int i,j,t,minn;
for(i=1; i<=n; i++)
Back[i]=Map[i][k];
vis[k]=1;
for(i=1; i<n; i++)
{
minn=INF;
for(j=1; j<=n; j++)
{
if(Back[j] < minn && !vis[j])
{
minn=Back[j];
t=j;
}
}
vis[t]=1;
for(j=1; j<=n; j++)
{
if(Back[j] > Back[t]+Map[j][t])
Back[j]=Back[t]+Map[j][t];
}
}
}
int main()
{
int i,j,u,v,w;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
for(i=0; i<MAX; i++)
for(j=0; j<MAX; j++)
Map[i][j]=INF;
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&u,&v,&w);
Map[u][v]=min(Map[u][v],w);
}
Godij();
Backdij();
int ans=0;
for(i=1; i<=n; i++)
{
if(i!=k)
{
ans=max(ans,Go[i]+Back[i]);
}
}
printf("%d\n",ans);
}
return 0;
}
原文:http://www.cnblogs.com/alan-W/p/5664904.html