poj3268

链接:点击打开链接

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

你可能感兴趣的:(poj3268)