这里写链接内容 http://poj.org/problem?id=3268
题目意思 :有n个牛分别在n个农场,每个牛都需要从自己的农场到另一个大牛的农场参加生日聚会,问这些牛中去和返回用时的最长的时间是多少。
思路:因为我没有仔细想考吧,wa了很多次,这道题对于我来说还是挺简单的,写的时候考虑到了一个问题,但是当时没有去想,就wa了好几次,也没改出来,心不仔细,挺难受的,也总是会犯这样的错误,希望以后慢慢地改了吧,就是去和返回最短路求一下,最后加在一起求最长的时间
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1005;
int e[N][N],e1[N][N],book[N],dis[N],dis1[N];
int i,j,n,m,x;
void dijkstra()
{
memset(book,0,sizeof(book));
for(i=1; i<=n; i++)
{
dis[i]=e[x][i];
//dis1[i]=e1[x][i];
}
dis[x]=0;
//dis1[x]=0;
book[x]=1;
int min,u;
for(i=1; i<=n-1; i++)
{
min=INF;
u=0;
for(j=1; j<=n; j++)
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];
u=j;
}
}
if(min==INF)
break;
book[u]=1;
for(int v=1; v<=n; v++)
{
if(e[u][v]<INF&&dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
void dijkstra1()
{
memset(book,0,sizeof(book));
for(i=1; i<=n; i++)
{
// dis[i]=e[i][x];
dis1[i]=e1[x][i];
}
// dis[x]=0;
dis1[x]=0;
book[x]=1;
int min1,u1;
for(i=1; i<=n-1; i++)
{
min1=INF;
u1=0;
for(j=1; j<=n; j++)
{
if(book[j]==0&&dis1[j]<min1)
{
min1=dis1[j];
u1=j;
}
}
if(min1==INF)
break;
book[u1]=1;
for(int v=1; v<=n; v++)
{
if(e1[u1][v]<INF&&dis1[v]>dis1[u1]+e1[u1][v])
dis1[v]=dis1[u1]+e1[u1][v];
}
}
}
int main()
{
int a,b,t;
while(~scanf("%d%d%d",&n,&m,&x))
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(i==j)
{
e[i][j]=0;
e1[i][j]=0;
}
else
{
e[i][j]=INF;
e1[i][j]=INF;
}
}
}
for(i=1; i<=m; i++)
{
scanf("%d %d %d",&a,&b,&t);
e[b][a]=t;
e1[a][b]=t;
}
dijkstra();
dijkstra1();
int max=-1;
for(i=1; i<=n; i++)
{
if(dis1[i]+dis[i]<INF&&dis[i]+dis1[i]>max)
max=dis1[i]+dis[i];
}
printf("%d\n",max);
}
return 0;
}