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

    最短路

    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
    /*迪杰斯特拉*/
     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<string.h>
     4 #define N 110
     5 #define INF 0xfffffff
     6 using namespace std;
     7 int n,m,vis[N],maps[N][N],dist[N];
     8 void Dij()
     9 {
    10     int i,j,Min,index;
    11     for(i=1;i<=n;i++)
    12     {
    13         Min=INF;
    14         for(j=1;j<=n;j++)
    15         {
    16             if(dist[j]<Min&&vis[j]==0)
    17             {
    18                 Min=dist[j];
    19                 index=j;
    20             }
    21         }
    22         vis[index]=1;
    23         for(j=1;j<=n;j++)
    24         {
    25             if(vis[j]==0&&dist[j]>dist[index]+maps[index][j])
    26             {
    27                 dist[j]=dist[index]+maps[index][j];
    28             }
    29         }
    30     }
    31 }
    32 int main()
    33 {
    34     int i,a,b,c,j;
    35     while(scanf("%d %d",&n,&m),m+n)
    36     {
    37         for(i=0;i<N;i++)
    38         {
    39             for(j=0;j<N;j++)
    40             {
    41                 maps[i][j]=INF;
    42             }
    43             dist[i]=INF;
    44         }
    45         memset(vis,0,sizeof(vis));
    46         for(i=0;i<m;i++)
    47         {
    48             scanf("%d %d %d",&a,&b,&c);
    49             maps[a][b]=min(maps[a][b],c);
    50             maps[b][a]=maps[a][b];
    51         }
    52         dist[1]=0;
    53         Dij();
    54         printf("%d
    ",dist[n]);
    55     }
    56     return 0;
    57 }

     /*弗洛伊德*/

     1 #include <iostream>
     2 #include <cmath>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <cstdio>
     6 #include <algorithm>
     7 #include <vector>
     8 #include <queue>
     9 using namespace std;
    10 #define INF 0xfffffff
    11 #define maxn 1002
    12 
    13 int G[maxn][maxn];
    14 int dist[maxn][maxn];
    15 int m, n;
    16 
    17 void Floyd()
    18 {
    19     for(int k=1; k<=n; k++)
    20     {
    21         for(int j=1; j<=n; j++)
    22         {
    23             for(int i=1; i<=n; i++)
    24             {
    25                 G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
    26             }
    27         }
    28     }
    29 }
    30 void Init()
    31 {
    32     for(int i=0; i<=n; i++)
    33     {
    34         G[i][i] = 0;
    35         for(int j=0; j<i; j++)
    36             G[i][j] = G[j][i] = INF;
    37     }
    38 }
    39 
    40 int main()
    41 {
    42     while(cin >> n >> m, m+n)
    43     {
    44         Init();
    45         for(int i=0; i<m; i++)
    46         {
    47             int a, b, c;
    48             cin >> a >> b >> c;
    49             G[a][b] = min(G[a][b],c);
    50             G[b][a] = G[a][b];
    51         }
    52 
    53         Floyd();
    54 
    55         cout << G[1][n] << endl;
    56     }
    57     return 0;
    58 }
     
  • 相关阅读:
    bzoj 3876: [Ahoi2014&Jsoi2014]支线剧情【有上下界有源汇最小费用最大流】
    bzoj 2055: 80人环游世界【有上下界有源汇最小费用最大流】
    bzoj 2406: 矩阵【二分+有源汇上下界可行流】
    bzoj 4873: [Shoi2017]寿司餐厅【最大权闭合子图】
    bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
    bzoj 2039: [2009国家集训队]employ人员雇佣【最小割】
    bzoj 3996: [TJOI2015]线性代数【最小割】
    bzoj 3158: 千钧一发【最小割】
    bzoj 2597: [Wc2007]剪刀石头布【最小费用最大流】
    bzoj 5120: [2017国家集训队测试]无限之环【最小费用最大流】
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4444968.html
Copyright © 2011-2022 走看看