zoukankan      html  css  js  c++  java
  • HDU 1874 畅通工程续 (Dijkstra)

    畅通工程续

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

     

    Description


     某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。


    现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
     

     
     

    Input


    本题目包含多组数据,请处理到文件结束。
    每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
    接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
    再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
     

     

    Output


     对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.

     

     

    Sample Input


    3 3
    0 1 1
    0 2 3
    1 2 1
    0 2
    3 1
    0 1 1
    1 2
     

     

    Sample Output


    2
    -1
     

     
    Analysis
      求图最短路,当然用Dijkstra
     
    Tips
    • 一个城市到另一个城市可以有多条路,但是要选最短的那一条
      1 #include <stdio.h>
      2 #include <string.h>
      3 #define INF 12000
      4 
      5 int map[205][205];
      6 
      7 int dist[205];
      8 bool s[205];
      9 int prev[205];
     10 int flag;
     11 
     12 
     13 void dijkstra(int n,int v)
     14 {
     15     int i,j;
     16 
     17     for(i=0;i<n;i++)
     18     {
     19         dist[i] = map[v][i];
     20         s[i] = 0;
     21         if(dist[i] >= INF) prev[i] = 0;
     22         else prev[i] = v;
     23     }
     24 
     25     //begin
     26     s[v] = 1;
     27     dist[v] = 0;
     28 
     29     for(i=0;i<n;i++)
     30     {
     31         int tmp = INF;
     32         int u = v;
     33         for(j=0;j<n;j++)
     34         {
     35             if(!s[j] && (dist[j]<tmp))
     36             {
     37                 u = j;
     38                 tmp = dist[j];
     39             }
     40         }
     41 
     42         if(tmp >= INF)
     43             break;
     44 
     45         s[u] = 1;
     46 
     47         for(j=0;j<n;j++)
     48         {
     49             if((!s[j]) && map[u][j] < INF )
     50             {
     51                 int newdist = dist[u] + map[u][j];
     52                 if(newdist < dist[j])
     53                 {
     54                     dist[j] = newdist;
     55                     prev[j] = u;
     56                 }
     57             }
     58         }
     59     }
     60 }
     61 
     62 int main()
     63 {
     64     int m,i,j,s,A,B,X,n,t;
     65 
     66     while(~scanf("%d%d",&n,&m))
     67     {
     68         flag = 0;
     69 
     70         for(i=0;i<n;i++)
     71             for(j=0;j<n;j++)
     72             map[i][j] = INF;
     73 
     74         for(i=0;i<n;i++)
     75             map[i][i] = 0;
     76 
     77         for(i=0;i<m;i++)
     78         {
     79             scanf("%d%d%d",&A,&B,&X);
     80             if(map[A][B] > X)
     81             {
     82                 map[A][B] = X;
     83                 map[B][A] = X;
     84             }
     85         }
     86         scanf("%d%d",&s,&t);
     87 /*
     88         //验证建图正确性
     89         printf("
    map:
    ");
     90         for(i=0;i<n;i++)
     91         {
     92             for(j=0;j<n;j++)
     93             printf("%d ",map[i][j]);
     94             printf("
    ");
     95         }
     96         printf("
    ");
     97 */
     98         dijkstra(n,s);
     99 
    100         if(dist[t] == INF) printf("-1
    ");
    101         else printf("%d
    ",dist[t]);
    102     }
    103     return 0;
    104 }
  • 相关阅读:
    jquery使用
    网站重构?
    WEB应用从服务器主动推送Data到客户端有那些方式?
    异步加载和延迟加载?
    平时如何管理你的项目?
    对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?
    约定优于配置(convention over configuration)
    JavaEE的13种核心技术
    The Spring Framework ConfigurableListableBeanFactory.java
    mySQL的boolean类型为tinyint(1)
  • 原文地址:https://www.cnblogs.com/GY8023/p/4682196.html
Copyright © 2011-2022 走看看