链接:点击打开链接
题意:给定一些路线和花费,然后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; }