poj3268

来源:互联网 发布:淘宝店铺装修视频2016 编辑:程序博客网 时间:2024/06/01 08:14

spfa。。。。其实最好用floyed,最简单,只是很久没写spfa了,练习一下

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <cmath>using namespace std;int n , m , k , all;const int M = 1e5;int pre[M + 10] , other[M + 10] , last[M + 10] , cost[M + 10] , seq[M + 10];int dis[M + 10] , Inque[M + 10];void build(int x , int y , int z){    pre[++all] = last[x];    last[x] = all;    other[all] = y;    cost[all] = z;}int  spfa(int s , int x){    memset(Inque , 0 , sizeof(Inque));    int head , tail , now , ed , dr;    head = 1 , tail = 0;    seq[++tail] = s;    for(int i = 1 ; i <= n ; i++) dis[i] = 1 << 30;    dis[s] = 0;    Inque[s] = 1;    while(head <= tail){        now = seq[head];        ed = last[now];        Inque[now] = 0;        while(ed != -1){            dr = other[ed];            if(dis[now] + cost[ed] < dis[dr]){                dis[dr] = dis[now] + cost[ed];                if(!Inque[dr]){                    Inque[dr] = 1;                    seq[++tail] = dr;                }            }            ed = pre[ed];        }        head++;    }    return dis[x];}int main(){    while(~scanf("%d %d %d",&n , &m , &k)){        memset(last , -1 , sizeof(last));        all = -1;        for(int i = 1 ; i <= m ; i++){            int a , b , c;            scanf("%d %d %d",&a , &b , &c);            build(a , b , c);        }        int ans = 0;        for(int i = 1 ; i <= n ; i++){            int tmp = 0;            tmp += spfa(i,k);            tmp += spfa(k,i);            if(ans < tmp) ans = tmp;        }        printf("%d\n",ans);    }    return 0;}
0 0