zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    MSBuild、条件编译、预处理命令
    批量数据插入SqlBulkCopy
    WPF 双向绑定
    编程思想之一
    python 提交表单
    python 添加用户
    python 分页
    day9 IO多路复用
    day9 线程、进程和协程深入版
    day8 进程、线程 简介版
  • 原文地址:https://www.cnblogs.com/yelan/p/2945208.html
Copyright © 2011-2022 走看看