//衆神雲集、羣魔亂舞、以一抵百、砥礪前行//18732 最短路問題--Dijkstra

題目描述

Description
現在有n個車站和m條直達公交線路,每條線路都有一個固定票價。
作爲一個窮人,你打算從車站1坐車到車站n,請計算下車站1到車站n的最少花費。
如果車站1無法到達車站n,請輸出-1。
注意,在車站x和y之間可能存在不止一條線路。

輸入格式
第一行兩個整數n和m,表示車站數量和線路數量。(1<=n<=100),(1<=m<=1000)
第二行至第m+1行,每行3個整數a,b,x,代表車站a和車站b之間有一條票價爲x的公交線路,公交線路是雙向的。

輸出格式
輸出車站1到n的最小花費。

輸入樣例
4 4
1 2 4
2 3 7
2 4 1
3 4 6

輸出樣例
5

解法

Dijkstra的模板題,只需要注意,若沒有最短路徑則輸出-1.

代碼如下:

//------------------------------Dijkstra--------------------------------//
//*            //-------衆神雲集、羣魔亂舞、以一抵百、砥礪前行---------//       *//
//----------------------------Acmer LEO 到此一遊------------------------------//
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
#define ll long long
#define maxn 0x3f3f3f3f
int n,m;
int graph[105][105];
int dist[105];
bool vis[105];
void init()
{
    memset(graph,maxn,sizeof(graph));
    memset(dist,maxn,sizeof(dist));
    for(int i=1; i<=103; i++)
        graph[i][i]=0;
}
void dijkstra()
{
    for(int i=1; i<=n; i++)
        dist[i]=graph[1][i];
    for(int i=1; i<=n; i++)
    {
        int cur=-1,minx=maxn;
        for(int j=1; j<=n; j++)
        {
            if(!vis[j]&&dist[j]<minx)
            {
                minx=dist[j];
                cur=j;
            }
        }
        if(cur==-1)
        {
            break;
        }
        vis[cur]=1;
        for(int j=1; j<=n; j++)
        {
            if(!vis[j]&&graph[cur][j]!=maxn&&dist[j]>dist[cur]+graph[cur][j])
                dist[j]=dist[cur]+graph[cur][j];
        }
    }
}
int main()
{
    cin>>n>>m;
    init();
    for(int i=0; i<m; i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        if(graph[x][y]>z)
            graph[x][y]=graph[y][x]=z;
    }
    dijkstra();
    if(dist[n]!=maxn)
        cout<<dist[n]<<'\n';
    else
        cout<<-1<<'\n';
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章