这题是从起点出发到达目的地后返回,所求的是所有路径中的最大值。
答案:n-1头牛出发抵达目标X的路+目标X再返回个点。返回很简单,只要使用dijkstra就可轻松解决。出发其实只要将这个矩阵转置,再用dijkstra就可以得到。这就像是将路的方向反向后再求X到个点的路。
下面贴代码
poj Silver Cow Party:
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 1005
#define INF 10000000
int cost[MAX][MAX];
int d1[MAX];
int d2[MAX];
int used[MAX];
int m,n,x;
void dijkstra(int d[])
{
fill(used,used+n+1,0);
fill(d,d+n+1,INF);
d[x]=0;
while(1)
{
int v=-1;
for(int i=1;i<=n;i++)
if(!used[i]&&(v==-1||d[i]<d[v]))v=i;
if(v==-1)break;
used[v]=1;
for(int i=1;i<=n;i++)
d[i]=min(d[i],d[v]+cost[v][i]);
}
}
void tran()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++){
swap(cost[i][j],cost[j][i]);
//printf("%d ",cost[i][j]);
}
// printf("\n");
}
}
int main()
{
scanf("%d%d%d",&n,&m,&x);
for(int i=0;i<=n;i++)
fill(cost[i],cost[i]+n+1,INF);
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
cost[a][b]=c;
}
dijkstra(d1);
tran();
dijkstra(d2);
int res=-1;
for(int i=1;i<=n;i++)
res=max(res,d1[i]+d2[i]);
printf("%d\n",res);
}