POJ 3268 Silver Cow Party

迪杰斯特拉,算法,题意理解了就好了: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;
}

  

posted @ 2016-07-12 21:10  声声醉如兰  阅读(178)  评论(0编辑  收藏  举报