您的位置:首页 > 其它

POJ 3268 Silver Cow Party 最短路

2017-05-13 19:20 281 查看
题意:有编号为1-N的牛,它们之间存在一些单向的路径。给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求这些牛中所花的最长的来回时间是多少。每头牛返回的最短时间很简单就可以算出来,这相当于从目标牛为起点求单源最短路径。但每头牛出发到目标牛的最短时间无法直接算出来,稍微转换一下,发现这个最短时间其实可以通过把所有的边取反向,然后再从目标牛求一次单源最短路径得到。得到这两个最短路径之后,取它们的和的最大者即可

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;

#define MAX 1005
#define MAX_NUM 0x7fffffff

int n;
int valuecome[MAX][MAX];
int valueback[MAX][MAX];
int dis[MAX];
bool visit[MAX];
int record[MAX];

void dijkstra(int x)
{
int temp=MAX_NUM;
int i;
int j;
int mark;
memset(visit,false,sizeof(visit));
for(i=1;i<=n;i++)
{
valuecome[i][i]=0;
dis[i]=valuecome[x][i];
}
dis[x]=0;
visit[x]=true;
for(i=1;i<n;i++)
{
temp=MAX_NUM;
mark=x;
for(j=1;j<=n;j++)
{
if(!visit[j]&&dis[j]<temp)
{
temp=dis[j];
mark=j;
}
}
visit[mark]=true;
for(j=1;j<=n;j++)
{
if((!visit[j])&&(valuecome[mark][j]<MAX_NUM))
{
int newdis=dis[mark]+valuecome[mark][j];
if(newdis<dis[j])
{
dis[j]=newdis;
}
}
}
}
}

void dijkstra2(int x)
{
int temp=MAX_NUM;
int i;
int j;
int mark;
memset(visit,false,sizeof(visit));
for(i=1;i<=n;i++)
{
valueback[i][i]=0;
dis[i]=valueback[x][i];
}
dis[x]=0;
visit[x]=true;
for(i=1;i<n;i++)
{
temp=MAX_NUM;
mark=x;
for(j=1;j<=n;j++)
{
if(!visit[j]&&dis[j]<temp)
{
temp=dis[j];
mark=j;
}
}
visit[mark]=true;
for(j=1;j<=n;j++)
{
if((!visit[j])&&(valueback[mark][j]<MAX_NUM))
{
int newdis=dis[mark]+valueback[mark][j];
if(newdis<dis[j])
{
dis[j]=newdis;
}
}
}
}
}

int main ()
{

int m,x;
int i,j;
int u,v,len;
scanf("%d%d%d",&n,&m,&x);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
valuecome[i][j]=MAX_NUM;
valueback[i][j]=MAX_NUM;
}
}

for(i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&len);
if(len<valuecome[u][v])
{
valuecome[u][v]=len;
valueback[v][u]=len;
}
}
dijkstra(x);
for(i=1;i<=n;i++)
{
record[i]+=dis[i];
}

dijkstra2(x);
for(i=1;i<=n;i++)
{
record[i]+=dis[i];
}
int max=0;
max=0;
for(i=1;i<=n;i++)
{
if(record[i]>max&&i!=x)
max=record[i];
}
printf("%d\n",max);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: