HDU 1874暢通工程續

某省自從實行了很多年的暢通工程計劃後,終於修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。 

現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。
Input本題目包含多組數據,請處理到文件結束。 
每組數據第一行包含兩個正整數N和M(0<N<200,0<M<1000),分別代表現有城鎮的數目和已修建的道路的數目。城鎮分別以0~N-1編號。 
接下來是M行道路信息。每一行有三個整數A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城鎮A和城鎮B之間有一條長度爲X的雙向道路。 
再接下一行有兩個整數S,T(0<=S,T<N),分別代表起點和終點。Output對於每組數據,請在一行裏輸出最短需要行走的距離。如果不存在從S到T的路線,就輸出-1. 
Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
Sample Output
2
-1

暢通工程系列題目倒是挺適合我們這種剛接觸圖的萌新
這個題目很簡單,我用的是dijsktra一個模板題,每天寫幾次模板,算法不熟悉都會寫~~~啊哈哈哈哈

這個題目因爲沒有注意城市可以爲0 重置dis數組時候 下標從1開始 wa了一次
代碼如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<queue>
#include<vector>
#include<stack>
#include<list>
using namespace std;
const int INF= 1e7;
struct node
{
    int next,v;
    node(int nt,int vb):next(nt),v(vb) {};
};
vector<node> p[1005];
int dis[1005];
bool operator < (pair<int,int > g,pair<int,int > h)
{
    return g.second < h.second;
}
void dijsktra(int o)
{
    priority_queue<pair<int,int> > q;
    q.push(pair<int,int > (0,o));
    while(!q.empty())
    {
        pair<int,int > temp =q.top();
        q.pop();
        int x=temp.second, ss=temp.first;
        if(dis[x]!=ss)
            continue ;
        for(int i=0; i<p[x].size(); i++)
        {
            int y=p[x][i].next,d=p[x][i].v;
            if(dis[y]>dis[x]+d)
            {
                dis[y]=dis[x]+d;
                q.push(pair<int,int >(dis[y],y));
            }
        }
    }
}
void init(int n)
{

    int i;
    for(i=0; i<=n; i++)
    {
        p[i].clear();
        dis[i]=INF;
    }
}
int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {
        int i,s,d,k;
        init(n);
        for(i=1; i<=m; i++)
        {
            scanf("%d %d %d",&s,&d,&k);
            p[s].push_back(node(d,k));
            p[d].push_back(node(s,k));
        }
        int qd,zd;
        scanf("%d %d",&qd,&zd);
        dis[qd]=0;
        dijsktra(qd);
        if(dis[zd]!=INF)
            cout<<dis[zd]<<endl;
        else cout<<-1<<endl;
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章