链接:点击打开链接
题意:给定一些路线和花费,然后N头牛,每头牛要求按照最短路走到X处,并用最短路在返回,问这些牛中所有路线里最大值是多少
代码:
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#define maxx 99999999
using namespace std;
int n,m,x;
int dis[1005][1005],dis1[1005],dis2[1005],vis[1005];
void dz(){ //矩阵转置
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<i;j++)
swap(dis[i][j],dis[j][i]);
}
void dijkstra(int temp[]){ //这个题n的范围是1000,用floyd算法肯定会超时
int i,j,u,cur; //因此想到dijkstra,从x点返回时的最短路就是dijkstra
for(i=1;i<=n;i++){ //模板,关键在于如何到达X时是最短路
temp[i]=dis[x][i];
vis[i]=0;
} //这是一个有向图因此只要将i到j的花费和j到i的花费
temp[x]=0;vis[x]=1; //颠倒一下就可以套用dijkstra模板,因此也就是将dis
for(i=2;i<=n;i++){ //矩阵转置
cur=maxx;u=x;
for(j=1;j<=n;j++){
if(!vis[j]&&temp[j]<cur){
cur=temp[j];
u=j;
}
}
vis[u]=1;
for(j=1;j<=n;j++)
if(!vis[j]&&dis[u][j]<maxx)
temp[j]=min(temp[j],temp[u]+dis[u][j]);
}
} //dijkstra模板
int main(){
int i,j,k,a,b,c,sum;
while(scanf("%d%d%d",&n,&m,&x)!=EOF){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dis[i][j]=maxx;
for(i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
dis[a][b]=c;
}
dijkstra(dis1);
dz();
dijkstra(dis2);
sum=-1;
for(i=1;i<=n;i++){
if(dis1[i]==maxx||dis2[i]==maxx)
continue; //如果这头牛走不到X则不考虑继续循环
sum=max(sum,dis1[i]+dis2[i]);
}
printf("%d\n",sum);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/stay_accept/article/details/47784555