• hdu1874畅通工程续


    http://acm.hdu.edu.cn/showproblem.php?pid=1874

    floyd: 62MS

    View Code
     1 #include<iostream>
     2 using namespace std ;
     3 #define maxn 210
     4 const int oo = 1<<28 ;
     5 int map[maxn][maxn] ;
     6 int n ;
     7 void init()
     8 {
     9     for(int i=0; i<n; i++)
    10     for(int j=0; j<n; j++)
    11     {
    12         map[i][j] = oo ;
    13         if(i==j)
    14         map[i][j] = 0 ;
    15     }
    16 }
    17 void floyd()
    18 {
    19     for(int k=0; k<n; k++)
    20     for(int i=0; i<n; i++)
    21     for(int j=0; j<n; j++)
    22     if(map[i][j]>map[i][k]+ map[k][j])
    23     map[i][j] = map[i][k] + map[k][j] ;
    24 }
    25 int main()
    26 {
    27     int m, a, b, c, s, t ;
    28     while(cin>>n>>m)
    29     {
    30         init() ;
    31         while(m--)
    32         {
    33             cin>>a>>b>>c ;
    34             if(map[a][b]>c)
    35             map[a][b] = map[b][a] = c ;
    36         }
    37         cin>>s>>t ;
    38         floyd() ;
    39         if(map[s][t]<oo)
    40         cout<<map[s][t]<<endl ;
    41         else
    42         cout<<"-1"<<endl ;
    43     }
    44     return 0 ;
    45 }


    dijkstra: 15MS

    View Code
     1 #include<iostream>
     2 #include<map>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<string>
     6 #include<algorithm>
     7 using namespace std;
     8 
     9 #define MAX 0x3f3f3f3f
    10 #define N 210
    11 int num, road, dis[N], len[N][N];
    12 bool visit[N];
    13 
    14 
    15 void Dijkstra(int start)
    16 {
    17     int k, temp;
    18     memset(visit, 0, sizeof(visit));
    19     for(int i = 0; i < num; ++i) //初始化
    20         dis[i] = (i==start ? 0 : MAX);
    21     for(int i = 0; i < num; ++i)
    22     {
    23         temp = MAX;
    24         for(int j = 0; j < num; ++j) //查找最短路
    25             if(!visit[j] && dis[j] < temp)
    26                 temp = dis[k = j];
    27         visit[k] = 1;
    28         for(int j = 0; j < num; ++j) //更新源点到其他点的最短路
    29             if(!visit[j] && dis[j] > dis[k] + len[k][j])
    30                 dis[j] = dis[k] + len[k][j];
    31     }
    32 }
    33 
    34 int main()
    35 {
    36     int a, b, cost, start, end;
    37     while(scanf("%d%d", &num, &road) != EOF)
    38     {
    39         memset(len, MAX, sizeof(len));
    40         for(int i = 0; i < road; ++i)
    41         {
    42             scanf("%d%d%d", &a, &b, &cost);
    43             if(cost < len[a][b]) //一条路可以有多个cost,记录最小的。注意~~~
    44             len[a][b] = len[b][a] = cost;
    45         }
    46         scanf("%d%d", &start, &end);
    47         Dijkstra(start);
    48         if(dis[end] == MAX) printf("-1\n");
    49         else printf("%d\n", dis[end]);
    50     }
    51     return 0;
    52 }
  • 相关阅读:
    HDU 2888 Check Corners (模板题)【二维RMQ】
    POJ 3264 Balanced Lineup(模板题)【RMQ】
    poj 3368 Frequent values(经典)【RMQ】
    SPOJ RPLN (模板题)(ST算法)【RMQ】
    UVA 796 Critical Links(模板题)(无向图求桥)
    UVA 315 Network (模板题)(无向图求割点)
    POJ 2029 Get Many Persimmon Trees (模板题)【二维树状数组】
    poj 3067 Japan 【树状数组】
    POJ 2481 Cows 【树状数组】
    POJ 1195 Mobile phones【二维树状数组】
  • 原文地址:https://www.cnblogs.com/yelan/p/2945208.html
Copyright © 2020-2023  润新知