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

    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
     
     
     
    思路:这题是最短路模板题,我这里用dfs暴力搜以及三种算法Floyd,Dijkstra,Bellman-ford都写了一遍,可以看看......
     
     
    dfs暴力搜索
     
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 using namespace std;
    10 #define ll long long 
    11 #define dd cout<<endl
    12 const int inf=99999999;
    13 const int mod=1e9+7;
    14 const int maxn=505;
    15 const int maxm=1e4+7;
    16 int n,m;
    17 int x,y,z;
    18 int e[maxn][maxn];
    19 int book[maxn]={0};
    20 int minn=inf;
    21 void init()
    22 {
    23     for(int i=0;i<maxn;i++)
    24         for(int j=0;j<maxn;j++)
    25             i==j?e[i][j]=0:e[i][j]=inf;
    26 }
    27 void dfs(int cur,int dis)
    28 {
    29     if(dis>minn)
    30         return ;
    31     if(cur==n)
    32     {
    33         if(dis<minn)
    34             minn=dis;
    35         return ;
    36     }
    37     for(int i=1;i<=n;i++)
    38     {
    39         if(book[i]==0&&e[cur][i]!=inf)
    40         {
    41             book[i]=1;
    42             dfs(i,dis+e[cur][i]);
    43             book[i]=0;
    44         }
    45     }
    46     return ;
    47 }
    48 int main()
    49 {
    50     while(cin>>n>>m)
    51     {
    52         if(!n&&!m)
    53             return 0;
    54         init();
    55         memset(book,0,sizeof(book));
    56         for(int i=0;i<m;i++)
    57         {
    58             scanf("%d%d%d",&x,&y,&z);
    59             e[x][y]=z;
    60             e[y][x]=z;
    61         }
    62         book[1]=1;
    63         minn=inf;
    64         dfs(1,0);
    65         printf("%d
    ",minn);
    66     }
    67     return 0;
    68 }
    View Code

     

    Floyd

     

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<cstdio>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 using namespace std;
    10 #define ll long long 
    11 const int inf=99999999;
    12 const int maxn=10002;
    13 int n,m;
    14 int x,y,z;
    15 int e[maxn][maxn];
    16 int dis[maxn];
    17 int book[maxn];
    18 void init()
    19 {
    20     for(int i=1;i<=n;i++)
    21         for(int j=1;j<=n;j++)
    22             i==j?e[i][j]=0:e[i][j]=inf;
    23 }
    24 int main()
    25 {
    26     while(scanf("%d%d",&n,&m)!=EOF)
    27     {
    28         if(!n&&!m)
    29             return 0;
    30         init();
    31         for(int i=1;i<=m;i++)
    32         {
    33             scanf("%d%d%d",&x,&y,&z);
    34             e[x][y]=z;
    35             e[y][x]=z;
    36         }
    37         for(int i=1;i<=n;i++)
    38             dis[i]=e[1][i];
    39         for(int k=1;k<=n;k++)
    40         {
    41             for(int i=1;i<=n;i++)
    42             {
    43                 for(int j=1;j<=n;j++)
    44                 {
    45                     if(e[i][j]>e[i][k]+e[k][j])
    46                         e[i][j]=e[i][k]+e[k][j];
    47                 }
    48             }
    49         }
    50         printf("%d
    ",e[1][n]);
    51     }
    52     return 0;
    53 }
    View Code

     

    Dijkstra

     

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<cstdio>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 using namespace std;
    10 #define ll long long 
    11 const int inf=99999999;
    12 const int maxn=10002;
    13 int n,m;
    14 int x,y,z;
    15 int e[maxn][maxn];
    16 int dis[maxn];
    17 int book[maxn];
    18 void init()
    19 {
    20     for(int i=1;i<=n;i++)
    21         for(int j=1;j<=n;j++)
    22             i==j?e[i][j]=0:e[i][j]=inf;
    23 }
    24 int main()
    25 {
    26     while(scanf("%d%d",&n,&m)!=EOF)
    27     {
    28         if(!n&&!m)
    29             return 0;
    30         init();
    31         for(int i=1;i<=m;i++)
    32         {
    33             scanf("%d%d%d",&x,&y,&z);
    34             e[x][y]=z;
    35             e[y][x]=z;
    36         }
    37         for(int i=1;i<=n;i++)
    38             dis[i]=e[1][i];
    39         book[1]=1;
    40         for(int k=1;k<=n-1;k++)
    41         {
    42             int minn=inf,temp;
    43             
    44             for(int i=1;i<=n;i++)
    45             {
    46                 if(book[i]==0&&dis[i]<minn)
    47                     minn=dis[temp=i];
    48             }
    49             book[temp]=1;
    50             for(int j=1;j<=n;j++)
    51             {
    52                 if(book[j]==0&&e[temp][j]<inf)
    53                 {
    54                     if(dis[j]>dis[temp]+e[temp][j])
    55                         dis[j]=dis[temp]+e[temp][j];
    56                 }
    57             }
    58         } 
    59         printf("%d
    ",dis[n]);
    60         memset(book,0,sizeof(book));
    61     }
    62     return 0;
    63 }
    View Code

     

    Bellman-ford

     

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<cstdio>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 using namespace std;
    10 #define ll long long 
    11 const int inf=99999999;
    12 const int maxn=10002;
    13 int n,m;
    14 int x,y,z;
    15 int e[maxn][maxn];
    16 int dis[maxn];
    17 int u[maxn];
    18 int v[maxn];
    19 int w[maxn];
    20 int book[maxn];
    21 void init()
    22 {
    23     for(int i=1;i<=n;i++)
    24         for(int j=1;j<=n;j++)
    25             i==j?e[i][j]=0:e[i][j]=inf;
    26 }
    27 int main()
    28 {
    29     while(scanf("%d%d",&n,&m)!=EOF)
    30     {
    31         if(!n&&!m)
    32             return 0;
    33         init();
    34         for(int i=1;i<=m;i++)
    35         {
    36             scanf("%d%d%d",&x,&y,&z);
    37             e[x][y]=z;
    38             e[y][x]=z;
    39             u[i]=x;
    40             v[i]=y;
    41             w[i]=z;
    42         }
    43         for(int i=m+1;i<=2*m;i++)
    44         {
    45             u[i]=v[i-m];
    46             v[i]=u[i-m];
    47             w[i]=w[i-m];
    48         }
    49         for(int i=1;i<=n;i++)
    50             i==1?dis[i]=0:dis[i]=inf;
    51         for(int k=1;k<=n-1;k++)
    52         {
    53             for(int i=1;i<=2*m;i++)
    54             {
    55                 if(dis[v[i]]>dis[u[i]]+w[i])
    56                     dis[v[i]]=dis[u[i]]+w[i];
    57             }
    58         }
    59         printf("%d
    ",dis[n]);
    60     }
    61     return 0;
    62 }
    View Code

     

     

    大佬见笑,,
  • 相关阅读:
    C语言习题(结构)
    java变量
    大咖分享 | 一文解锁首届云创大会干货——上篇(文末附演讲ppt文件免费下载)
    深入解读Service Mesh的数据面Envoy
    appium封装显示等待Wait类和ExpectedCondition接口
    Jmeter压测Thrift服务接口
    浏览器插件及好用的小工具
    Jmeter入门实例
    BugBash活动分享
    如何作缺陷分析
  • 原文地址:https://www.cnblogs.com/xwl3109377858/p/10663018.html
Copyright © 2011-2022 走看看