POJ3268—Silver Cow Party

来源:互联网 发布:三国志10 兵种 数据 编辑:程序博客网 时间:2024/06/11 05:18

题目大意:一群牛要去 t 地点参加一个party,牛从自己的家里出发,然后party接受了以后要回家,求出这些牛中所用时间最长的。

用两次dij,分别求出各地点到T的距离和T到各地点的距离。

#include<cstdio>#include<iostream>int map[1024][1024];int dis[1024];int dis1[1024];int v[1024];int n,m,t;const int INF=1<<28;void Dij1(int s)     //求T到各地点的距离{int i,j;for(i=1;i<=n;i++){dis[i]=map[s][i];v[i]=0;}dis[s]=0;v[s]=1;for(i=1;i<=n;i++){int min=INF;int pos=0;for(j=1;j<=n;j++)if(!v[j])if(dis[j]<min){pos=j;min=dis[j];}if(min==INF)break;v[pos]=1;for(j=1;j<=n;j++){int p;if(!v[j])if(p=map[pos][j]+dis[pos],p<dis[j])dis[j]=p;}}}void Dij2(int s)   //求每个地点到T的最短距离{int i,j;for(i=1;i<=n;i++){dis1[i]=map[i][s];v[i]=0;}dis1[s]=0;v[s]=1;for(i=1;i<=n;i++){int min=INF;int pos=0;for(j=1;j<=n;j++){if(!v[j])if(dis1[j]<min){pos=j;min=dis1[j];}}v[pos]=1;for(j=1;j<=n;j++){int p;if(!v[j])if(p=map[j][pos]+dis1[pos],p<dis1[j])dis1[j]=p;}}}int main(){int i,j;while(scanf("%d%d%d",&n,&m,&t)!=EOF){for(i=1;i<=n;i++)    //建图for(j=1;j<=n;j++)map[i][j]=INF;for(i=1;i<=m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);if(c<map[a][b])map[a][b]=c;}Dij1(t);Dij2(t);int max=0;for(i=1;i<=n;i++){int term=dis[i]+dis1[i];max=term>max?term:max;}printf("%d\n",max);}return 0;}


原创粉丝点击