題目描述
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;
}