hau 1874 畅通工程续

来源:互联网 发布:js调用浏览器打印 编辑:程序博客网 时间:2024/06/09 22:21

点击打开链接hdu 1874


思路:最短路+floyd

注意事项:由于输入的数据中会有重边的出现,那么如果出现重边的时候应该取值小的那一个。(这个trick让我WA了很久)


代码:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;#define MAXN 210#define INF 0xFFFFFFFlong long  dis[MAXN][MAXN];int vis[MAXN];int star , end;int n , m;void init(){    for(int i = 0 ; i < n ; i++){       for(int j = 0 ; j < n ; j++){          if(i == j)            dis[i][j] = 0;          else            dis[i][j] = INF;       }    }}long long min(long long a , long long b){     return a < b ? a : b;}void floyd(){     for(int k = 0 ; k < n ; k++){        for(int i = 0 ; i < n ; i++){           for(int j = 0 ; j < n ; j++)              dis[i][j] = min(dis[i][j] , dis[i][k]+dis[k][j]);        }     }}int main(){   // freopen("input.txt" , "r" , stdin);    int value;    while(scanf("%d%d" , &n , &m) != EOF){         init();         for(int i = 0 ; i < m ; i++){            scanf("%d%d%d" , &star , &end , &value);            if(dis[star][end] == INF)              dis[star][end] = dis[end][star] = value;            else{              if(dis[star][end] > value)                dis[star][end] = dis[end][star] = value;            }          }         scanf("%d%d" , &star , &end);         floyd();         if(dis[star][end] != INF)           printf("%lld\n" , dis[star][end]);         else           printf("-1\n");    }         return 0;}

原创粉丝点击