///这个题的意思就是说:一群牛要去指定的一头牛的家里做客,然后呢去的时候的路线和返回的路线可能不一样(有向图的权值不一样),
///求到达那头牛家里的时间和返回家里的时间和的最大值;(求里面的某一头 去和回来 时间的最大值;)
///因为这个是有向图,所以呢,咋们可以来两遍dijkstra,过去和回来,然后再最后取一个最大值就好了;
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int MAX(int a,int b){return (a>b)?a:b;}
int MIN(int a,int b){return (a<b)?a:b;}
const int inf=1e8+7;
const int maxn=1e3+7;
bool vis[maxn];
int mmp[maxn][maxn],dis1[maxn],dis2[maxn];//.就是记录两个路径的的最小值;
int n,m,x;
void dijkstra1(int x)///去的;
{
for(int i=1;i<=n;i++)
{
dis1[i]=inf;
vis[i]=0;
}
dis1[x]=0;
for(int i=1;i<=n;i++)
{
int k,Min=inf;
for(int j=1;j<=n;j++)
if(!vis[j]&&dis1[j]<Min)
Min=dis1[k=j];
vis[k]=1;
for(int j=1;j<=n;j++)
dis1[j]=MIN(dis1[j],dis1[k]+mmp[k][j]);
}
}
void dijkstra2(int x)///回来的;
{
for(int i=1;i<=n;i++)
{
dis2[i]=inf;
vis[i]=0;
}
dis2[x]=0;
for(int i=1;i<=n;i++)
{
int k,Min=inf;
for(int j=1;j<=n;j++)
if(!vis[j]&&dis2[j]<Min)
Min=dis2[k=j];
vis[k]=1;
for(int j=1;j<=n;j++)
dis2[j]=MIN(dis2[j],dis2[k]+mmp[j][k]);
}
}
int main ()
{
scanf("%d %d %d",&n,&m,&x);///n:多少群(家)牛,m:路径数,x:哪一家;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mmp[i][j]=inf;
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if(c<mmp[a][b]) mmp[a][b]=c;
}
dijkstra1(x);
dijkstra2(x);
///跑两遍dijkstra,只是图的方向可能不一样
int ans=0;
for(int i=1;i<=n;i++)
if(dis1[i]!=inf&&dis2[i]!=inf) ans=MAX(ans,dis1[i]+dis2[i]);
printf("%d\n",ans);
return 0;
}
POJ - 3268 Silver Cow Party(两遍dijktsra)
最新推荐文章于 2022-02-09 15:07:43 发布