CDOJ 30 最短路

最短路

Time Limit: 3000 / 1000 MS (Java/Others)     Memory Limit: 65535 / 65535 KB (Java/Others)
 

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

Input

输入包括多组数据。

每组数据第一行是两个整数N,M(N100,M10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。

接下来M行,每行包括3个整数A,B,C(1A,BN,1C1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。

输入保证至少存在1条商店到赛场的路线。

Output

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间。

Sample input and output

Sample InputSample Output
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
3
2

Source

电子科技大学第六届ACM程序设计大赛 初赛
 
 
 
Dijkstra算法的直接练习题,最短路的经典算法,基础题目,太久没打,虽然能过不过代码不太好看。。。。
基本就是在s[]中存以1为起点的最短路长度,每次找s[]中最短的来更新其他节点,就可以了,当然找过的点应该标记一下,下次就不用找这个点了。

 

#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int path[105][105];
int s[105];
bool use[105];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    while (!((n==0)&(m==0))){
        memset(path,1000000,sizeof(path));
        memset(s,1000000,sizeof(s));
        memset(use,true,sizeof(use));
        s[1]=0;
        int j,k,l,g,h;
        j=m;
        while (j--){
            scanf("%d%d%d",&g,&h,&l);
            path[g][h]=l;
            path[h][g]=l;
        }
        for (j=2;j<=n;j++)
            s[j]=path[1][j];
        for (j=2;j<=n;j++){
            l=10000000;
            for (k=2;k<=n;k++){
                if ((s[k]<l)&&(use[k])){
                    l=s[k];
                    g=k;
                }
            }
            use[g]=false;
            for (k=2;k<=n;k++){
                if (s[k]>s[g]+path[g][k])
                    s[k]=s[g]+path[g][k];
            }
        }
        printf("%d\n",s[n]);
        scanf("%d%d",&n,&m);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Atlantis67/p/3622128.html