您的位置:首页 > 其它

hdu 2544 最短路(最短路spfa)

2015-04-08 23:52 176 查看

最短路

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 37396 Accepted Submission(s): 16280



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

题目分析:

单源最短路模板题

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#define MAX 107

using namespace std;

int n,m;

struct Edge
{
    int v,w,next;
}e[MAX*MAX];

int head[MAX];
int cc;

void add ( int u , int v , int w )
{
    e[cc].v = v;
    e[cc].w = w;
    e[cc].next = head[u];
    head[u] = cc++;
}

int dis[MAX];
bool used[MAX];
int cnt[MAX];

bool spfa ( )
{
    memset ( dis , 0x3f , sizeof ( dis ) );
    memset ( used , false , sizeof ( used ) );
    memset ( cnt , 0 , sizeof ( cnt ) );
    dis[1] = 0;
    used[1] = true;
    cnt[1] = 1;
    queue<int> q;
    q.push (1);
    while ( !q.empty())
    {
        int u = q.front();
        q.pop();
        used[u] = false;
        for ( int i = head[u] ; ~i ; i =e[i].next )
        {
            int v = e[i].v;
            if ( dis[v] <= dis[u] + e[i].w ) continue;
            dis[v] = dis[u] + e[i].w;
            if ( used[v] ) continue;
            q.push ( v );
            used[v] = true;
            if ( ++cnt[v] > n ) return false;
        }
    }
    return true;
}

int main ( )
{
    int a,b,c;
    while ( ~scanf ( "%d%d" , &n , &m ) )
    {
        if ( !n && !m ) break;
        memset ( head , -1 ,sizeof ( head ) );
        cc = 0;
        for ( int i = 0 ; i < m ; i++ )
        {
            scanf ( "%d%d%d" , &a , &b , &c );
            add ( a , b , c );
            add ( b , a , c );
        }
        spfa ( );
        printf ( "%d\n" , dis
 );
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: