给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。
请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 nn 号点,则输出 −1。
输入格式
第一行包含整数 n 和 m。
接下来 mm 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。
输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。
如果路径不存在,则输出 −1。
数据范围
11≤n≤500,
1≤m≤105,
图中涉及边长均不超过10000。
输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出
3
#include <bits/stdc++.h> #define Inf 0x3f3f3f3f using namespace std; int n,m; int dist[505]; int Dijstra(int n, int v,int *dist,int map[505][505]) { bool s[505]; for(int i=1;i<=n;i++) { dist[i]=map[v][i]; s[i]=0; } dist[v]=0; s[v]=1; for(int i=1;i<n;i++) { int u=v; int temp=Inf; for(int j=1;j<n;j++) { if(!s[j]&&dist[j]<temp) { u=j; temp=dist[j]; } } s[u]=1; for(int j=1;j<=n;j++) { if(!s[j]&&map[u][j]<Inf) { int newdist=dist[u]+map[u][j]; if(newdist < dist[j]) { dist[j] = newdist; } } } } if(dist[n]==Inf) return -1; //如果第n个点路径为无穷大即不存在最低路径 return dist[n]; } int main() { while(cin>>n>>m) { int map[505][505]; memset(map,Inf,sizeof(map)); while(m--) { int x,y,z; cin>>x>>y>>z; map[x][y]=min(map[x][y],z); } int ans=Dijstra(n, 1,dist,map); cout<<ans<<endl; } }