1. 程式人生 > >hdu 2544 單源最短路問題 dijkstra+堆優化模板

hdu 2544 單源最短路問題 dijkstra+堆優化模板

尋找 問題 col .cn 入隊 ron ava iss cto

最短路

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


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&lt;=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 最短路的入門題。剛開始接觸。好奇妙~~


//hdu 2544 最短路
// dijkstra堆優化模板
//大部分參照挑戰程序設計競賽書上代碼
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#define inf 0x3f3f3f3f
#define mem(a,x) memset(a,x,sizeof(a))

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

inline int in()
{
    int res=0;char c;
    while((c=getchar())<'0' || c>'9');
    while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
    return res;
}
struct st
{
    int to;
    int cost;
    st(int a,int b)//構造函數
    {
        to=a;
        cost=b;
    }
};

int dis[111];
vector<st> v[111];
//通過指定greater<pii>參數,堆會依照first從小到大的順序取出值
priority_queue<pii,vector<pii>,greater<pii> > q;
                                    //pair<int,int>的first表示最短距離。second表示頂點編號
int main()
{

    int n,m;
    while(~scanf("%d%d",&n,&m) && n)
    {
        mem(dis,inf);          //初始化無窮大
        for(int i=0;i<=n;i++)
        {
            v[i].clear();
        }
        for(int i=1;i<=m;i++)
        {
            int t=in();
            int t1=in(),t2=in();
            v[t].push_back(st(t1,t2));
            v[t1].push_back(st(t,t2));//無向圖必須push兩次
        }
        q.push(pii(0,1));
        dis[1]=0;       //初始化
        while(!q.empty())
        {
            pii x = q.top();     
            q.pop();
            int tmp=x.second;
            if(dis[tmp]<x.first)continue;
            for(int i=0;i<(int)v[tmp].size();i++)//當前頂點能到的點
            {
                st t=v[tmp][i];
                if(dis[t.to]>dis[tmp]+t.cost) //當前頂點最短距離+它到這一點的距離是否比它能到的這點的最短距離小
                {
                    dis[t.to]=dis[tmp]+t.cost;  //小的話就更新
                    q.push(pii(dis[t.to],t.to)); //而且入隊
                }
            }
        }
        cout<<dis[n]<<endl;
    }
    return 0;
}




hdu 2544 單源最短路問題 dijkstra+堆優化模板