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

    最短路

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


    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
     
    Source
     
    Recommend
    lcy   |   We have carefully selected several similar problems for you:  1142 1385 2680 1596 1690 
     
    最短题的模板题,因为城市小于100组,所以可以用佛洛依德,当然也可以用迪杰斯特拉,代码就是模板,很简单。
     
    题意:中文题,很好理解。
     
    附上代码:
     
    1.佛洛依德
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define M 105
     5 #define MAX 0x3f3f3f3f
     6 using namespace std;
     7 int n,map[M][M];
     8 void floyd()   //直接暴力,要求数据小于100
     9 {
    10     int i,j,k;
    11     for(k=1; k<=n; k++)
    12         for(i=1; i<=n; i++)
    13             for(j=1; j<=n; j++)
    14             {
    15                 if(map[i][j]>map[i][k]+map[k][j])   //注意这个顺序,改了会错
    16                     map[i][j]=map[i][k]+map[k][j];
    17             }
    18 }
    19 
    20 int main()
    21 {
    22     int m,i,j;
    23     while(~scanf("%d%d",&n,&m))
    24     {
    25         if(n==0&&m==0)
    26             break;
    27         for(i=1; i<=n; i++)
    28             for(j=1; j<=n; j++)
    29             {
    30                 if(i==j)
    31                     map[i][j]=0;
    32                 else
    33                     map[i][j]=MAX;
    34             }
    35         int a,b,c;
    36         for(i=0; i<m; i++)
    37         {
    38             scanf("%d%d%d",&a,&b,&c);
    39             if(map[a][b]>c)
    40                 map[a][b]=map[b][a]=c;
    41         }
    42         floyd();
    43         printf("%d
    ",map[1][n]);
    44     }
    45     return 0;
    46 }

    2.迪杰斯特拉

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define M 105
     5 #define MAX 0x3f3f3f3f
     6 using namespace std;
     7 int map[M][M],vis[M],dis[M];
     8 int main()
     9 {
    10     int n,m,i,j;
    11     while(~scanf("%d%d",&n,&m))
    12     {
    13         if(n==0&&m==0)
    14             break;
    15         memset(vis,0,sizeof(vis));
    16         memset(dis,0,sizeof(dis));
    17         for(i=1; i<=n; i++)
    18             for(j=1; j<=n; j++)
    19             {
    20                 if(i==j)
    21                     map[i][j]=0;
    22                 else
    23                     map[i][j]=MAX;
    24             }
    25         int a,b,c;
    26         for(i=0; i<m; i++)
    27         {
    28             scanf("%d%d%d",&a,&b,&c);
    29             if(map[a][b]>c)
    30                 map[a][b]=map[b][a]=c;
    31         }
    32         vis[1]=1;
    33         for(i=1; i<=n; i++)
    34             dis[i]=map[1][i];
    35         int min,t;
    36         for(i=1; i<=n; i++)
    37         {
    38             min=MAX;
    39             for(j=1; j<=n; j++)
    40                 if(!vis[j]&&min>dis[j])
    41                 {
    42                     min=dis[j];
    43                     t=j;
    44                 }
    45             vis[t]=1;
    46             for(j=1; j<=n; j++)
    47                 if(!vis[j]&&map[t][j]<MAX)
    48                     if(dis[j]>map[t][j]+dis[t])
    49                         dis[j]=map[t][j]+dis[t];
    50         }
    51         printf("%d
    ",dis[n]);
    52     }
    53     return 0;
    54 }

     3.邻接表

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 #define inf 0x3f3f3f3f
     6 using namespace std;
     7 struct Edge
     8 {
     9     int from,to,val,next;
    10 }edge[10005];
    11 int n,m;
    12 int tol;
    13 int dis[105];
    14 bool vis[105];
    15 int head[10005];
    16 
    17 void init()
    18 {
    19     tol=0;
    20     memset(head,-1,sizeof(head));
    21 }
    22 
    23 void addEdge(int u,int v,int w)
    24 {
    25     edge[tol].from=u;
    26     edge[tol].to=v;
    27     edge[tol].val=w;
    28     edge[tol].next=head[u];
    29     head[u]=tol++;
    30     edge[tol].from=v;
    31     edge[tol].to=u;
    32     edge[tol].val=w;
    33     edge[tol].next=head[v];
    34     head[v]=tol++;
    35 }
    36 
    37 
    38 void getmap()
    39 {
    40     int a,b,c;
    41     while(m--)
    42     {
    43         scanf("%d%d%d",&a,&b,&c);
    44         addEdge(a,b,c);
    45     }
    46     memset(vis,false,sizeof(vis));
    47     memset(dis,inf,sizeof(dis));
    48 }
    49 
    50 void spfa()
    51 {
    52     queue<int>q;
    53     q.push(1);
    54     dis[1]=0;
    55     vis[1]=true;
    56     while(!q.empty())
    57     {
    58         int u=q.front();
    59         q.pop();
    60         vis[u]=false;
    61         for(int i=head[u];i!=-1;i=edge[i].next)
    62         {
    63             int v=edge[i].to;
    64             if(dis[v]>dis[u]+edge[i].val)
    65             {
    66                 dis[v]=dis[u]+edge[i].val;
    67                 if(!vis[v])
    68                 {
    69                     vis[v]=true;
    70                     q.push(v);
    71                 }
    72             }
    73         }
    74     }
    75     printf("%d
    ",dis[n]);
    76     return;
    77 }
    78 
    79 int main()
    80 {
    81 
    82     int i,j;
    83     while(~scanf("%d%d",&n,&m))
    84     {
    85         if(n==0&&m==0)
    86             break;
    87         init();
    88         getmap();
    89         spfa();
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    Systemverilog for design 笔记(三)
    SystemVerilog for design 笔记(二)
    Systemverilog for design 笔记(一)
    假如m是奇数,且m>=3,证明m(m² -1)能被8整除
    SharpSvn操作 -- 获取Commit节点列表
    GetRelativePath获取相对路径
    Dictionary(支持 XML 序列化),注意C#中原生的Dictionary类是无法进行Xml序列化的
    Winform中Checkbox与其他集合列表类型之间进行关联
    Image(支持 XML 序列化),注意C#中原生的Image类是无法进行Xml序列化的
    修复使用<code>XmlDocument</code>加载含有DOCTYPE的Xml时,加载后增加“[]”字符的错误
  • 原文地址:https://www.cnblogs.com/pshw/p/5369937.html
Copyright © 2011-2022 走看看