zoukankan      html  css  js  c++  java
  • 最短路

    最短路

    Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 1   Accepted Submission(s) : 1
    Problem Description
    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

     
    Input
    输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
    输入保证至少存在1条商店到赛场的路线。
     
    Output
    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
     
    Sample Input
    2 1
    1 2 3
    3 3
    1 2 5
    2 3 5
    3 1 2
    0 0
     
    Sample Output
    3
    2
     
    思路:图的最短路径问题,Dijkstra算法,和Prime算法类似
     
    AC代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 int map[101][101],dist[101];
     4 int vis[101];
     5 void init1(int n)
     6 {
     7     int i,j;
     8     for(i = 1;i <= n;i ++)
     9     {
    10         for(j = 1;j <= n;j ++)
    11         {
    12             map[i][j] = 1 << 30;
    13         }
    14     }
    15     return ;
    16 }
    17 
    18 void init2(int n)
    19 {
    20     int i;
    21     memset(vis,0,sizeof(vis));
    22     for(i = 1;i <= n;i ++)
    23       dist[i] = map[1][i];
    24     return ;
    25 }
    26 
    27 int main()
    28 {
    29     int n,m,i,j,k;
    30     int a,b,w,min,sum;
    31     while(~scanf("%d%d",&n,&m) && (m+n))
    32     {
    33         init1(n);
    34         while(m--)
    35         {
    36             scanf("%d%d%d",&a,&b,&w);
    37             map[b][a] = map[a][b] = w;
    38         }
    39         init2(n);
    40         vis[1] = 1;
    41         for(i = 1;i <= n;i ++)
    42         {
    43             min = 1 << 30;
    44             for(j = 1;j <= n;j ++)
    45             {
    46                 if(!vis[j] && min > dist[j])
    47                 {
    48                     min = dist[j];
    49                     k = j;
    50                 }
    51             }
    52             vis[k] = 1;
    53             for(j = 1;j <= n;j ++)
    54             {
    55                 if(!vis[j] && dist[j] > dist[k]+map[k][j])
    56                   dist[j] = dist[k]+map[k][j];
    57             }
    58         }
    59         printf("%d
    ",dist[n]);
    60     }
    61     return  0;
    62 }
  • 相关阅读:
    博文视点大讲堂第20期——Windows 7来了
    程序员如何缓解“电脑病”
    HQL中In的问题详解
    Tomcat、Websphere和Jboss类加载机制
    Hibernate锁机制悲观锁和乐观锁
    软件项目开发典型风险一览过程篇
    XPath实例教程
    CMMI的含义及重点
    自动化测试工具selenium使用介绍
    深入DNS域名解析服务原理
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3391254.html
Copyright © 2011-2022 走看看