最短路

来源:互联网 发布:淘宝买家秀的福利网盘 编辑:程序博客网 时间:2024/06/07 02:45

C - 最短路
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u

Submit

Status



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
#include <cstdio>#include <cstring>using namespace std;const int mmax = 110;const int INF = 0x3f3f3f3f;    int N, M;int map[mmax][mmax], dis[mmax], vis[mmax];void Dijkstra (){    int k, i, j;    for ( i = 1;i  <= N; i++)    {        dis[i] = map[1][i];        vis[i] = 0;    }    dis[1] = 0;    vis[1] = 1;    for ( i = 1; i <= N; i++)    {        int temp = INF;        for ( j = 1; j <= N; j++)        {            if (!vis[j] && dis[j] < temp)            {                k = j;                temp = dis[j];            }        }        vis[k] = 1;        for ( j = 1; j <= N; j++)        {            if (!vis[j] && dis[k] + map[k][j] < dis[j])            {                dis[j] = dis[k] + map[k][j];            }        }    }}int main (){    while (scanf ("%d%d", &N, &M) != EOF)    {        memset (map, INF, sizeof(map));        if (N == 0 && M == 0)   break;        int a, b, c;        for (int i =0 ; i < M; i++)        {            scanf ("%d%d%d", &a, &b, &c);            if (c < map[a][b])                {                    map[a][b] = c;                    map[b][a] = c;                }        }        Dijkstra ();        printf ("%d\n", dis[N]);    }    return 0;}


0 0
原创粉丝点击