最短路HDU2544

最短路

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


 

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

UESTC 6th Programming Contest Online

Recommend

lcy

AC代码

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 105;
const int INF = 0x3f3f3f3f;
#define PI 3.1415927

int n, m;
int t;
int road[maxn][maxn];
bool visit[maxn];
int dist[maxn];
int findmin()
{
    int v = -1, minlen = INF;
    for(int i = 1; i <= n; ++i)
    {
        if(!visit[i] && dist[i] < minlen)
        {
            v = i;
            minlen = dist[i];
        }
    }
    return v;
}
void dij(int s)
{
    visit[s] = true;
    for(int i = 1; i <= n; ++i)
    {
        dist[i] = road[1][i];
    }
    while(1)
    {
        int v = findmin();
        if(-1 == v)
            break;
        visit[v] = true;
        for(int i = 1; i <= n; ++i)
        {
            if( !visit[i] && dist[v] + road[v][i] < dist[i] )
            {
                dist[i] = dist[v] + road[v][i];
            }
        }
    }
}
int main()
{
    while(~scanf("%d%d", &n, &m) && (n || m))
    {
        memset(visit, 0, sizeof(visit));
        for(int i = 1; i <= n; ++i)
        {
            for(int j = 1; j <= n; ++j)
            {
                if(i == j)
                    road[i][j] = 0;
                else
                    road[i][j] = INF;
            }
        }
        int ta, tb, tc;
        for(int i = 0; i < m; ++i)
        {
            scanf("%d%d%d", &ta, &tb, &tc);
            road[ta][tb] = tc;
            road[tb][ta] = tc;
        }
        dij(1);
        printf("%d\n",dist[n]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40758751/article/details/81263936