zoukankan      html  css  js  c++  java
  • HDOJ 2544

    最短路

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 24454    Accepted Submission(s): 10531

    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
     
    floyed 算法:
    9847825 2013-12-17 19:13:16 Accepted 2544 15MS 296K 759 B C++ 泽泽
     
     1 #include <stdio.h>
     2 #include<string.h>
     3 int g[101][101];
     4 #define inf 0xfffff;
     5 void floyed(int n)
     6 {
     7     int i,j,k;
     8     for(k=1;k<=n;k++)
     9     {
    10         for(i=1;i<=n;i++)
    11         {
    12             for(j=1;j<=n;j++)
    13             {
    14                 if(g[i][k]+g[k][j]<g[i][j])
    15                     g[i][j]=g[i][k]+g[k][j];
    16             }
    17         }
    18     }
    19 }
    20 int main()
    21 {
    22     int n,m,a,b,x,i,j;
    23     while(scanf("%d %d",&n,&m)!=EOF)
    24     {
    25         if(!n&&!m)break;
    26         for(i=1;i<=n;i++)
    27         {
    28             for(j=1;j<=n;j++)
    29             {
    30                 if(i==j)
    31                     g[i][j]=0;
    32                 else
    33                 g[i][j]=inf;
    34             }
    35         }
    36         for(i=1;i<=m;i++)
    37         {
    38             scanf("%d %d %d",&a,&b,&x);
    39             if(g[a][b]>x)
    40               g[a][b]=g[b][a]=x;
    41         }
    42         //prim(n);
    43         floyed(n);
    44         printf("%d
    ",g[1][n]);
    45     }
    46     return 0;
    47 }
    View Code
    dijkstra最简单算法运用:
     1 #include <stdio.h>
     2 #include<string.h>
     3 int g[101][101];
     4 #define inf 0xfffff;
     5 void prim(int n)
     6 {
     7     int lowcost[101],used[101],i,j,k;
     8     memset(used,0,sizeof(used));
     9     memset(lowcost,0,sizeof(lowcost));
    10     for(i=1;i<=n;i++)
    11         lowcost[i]=g[i][1];
    12     used[1]=1;
    13     for(i=1;i<n;i++)
    14     {
    15         int min=inf;
    16         j=1;
    17         for(k=2;k<=n;k++)
    18             if(lowcost[k]<min&&!used[k])
    19                 min=lowcost[k],j=k;
    20         used[j]=1;
    21         for(k=2;k<=n;k++)
    22         {
    23             if(lowcost[j]+g[k][j]<lowcost[k]&&!used[k])
    24                 lowcost[k]=lowcost[j]+g[k][j],
    25                 g[k][1]=g[1][k]=lowcost[k];
    26         }
    27     }
    28 
    29 }
    30 int main()
    31 {
    32     int n,m,a,b,x,i,j;
    33     while(scanf("%d %d",&n,&m)!=EOF)
    34     {
    35         if(!n&&!m)break;
    36         for(i=1;i<=n;i++)
    37         {
    38             for(j=1;j<=n;j++)
    39             {
    40                 if(i==j)
    41                     g[i][j]=0;
    42                 else
    43                 g[i][j]=inf;
    44             }
    45         }
    46         for(i=1;i<=m;i++)
    47         {
    48             scanf("%d %d %d",&a,&b,&x);
    49             if(g[a][b]>x)
    50               g[a][b]=g[b][a]=x;
    51         }
    52         prim(n);
    53         printf("%d
    ",g[1][n]);
    54     }
    55     return 0;
    56 }
    View Code
    9847784 2013-12-17 19:08:40 Accepted 2544 15MS 300K 941 B C++ 泽泽
  • 相关阅读:
    【2018.10.3】万圣节的快递
    【2018.10.3】万圣节的入场券
    【2018.10.2】纸条
    【2018.10.2】菌落合并
    【2018.10.2】Note of CXM
    【2018.10.1】【JSOI2016】最佳团体(bzoj4753)
    【2018.10.1】「JOI 2014 Final」年轮蛋糕
    【2018.9.26】K-D Tree详解
    Python中的numpy模块解析
    Python中xlrd模块解析
  • 原文地址:https://www.cnblogs.com/zeze/p/hdoj2544.html
Copyright © 2011-2022 走看看