给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。
请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。
输入格式
第一行包含整数n和m。
接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。
输出格式
输出一个整数,表示1号点到n号点的最短距离。
如果路径不存在,则输出-1。
数据范围
1≤n≤5001≤n≤500,
1≤m≤1051≤m≤105,
图中涉及边长均不超过10000。
输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出样例:
3
#include <iostream>
#include <algorithm>
#include<vector>
#include<map>
#include<string>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
#include<unordered_map>
#include<queue>
#include<climits>
#include<stack>
using namespace std;
const int maxn= 510;
const int INF=INT_MAX;
int g[maxn][maxn];
int d[maxn];
int n,m;
bool vis[maxn]={false};
void dijkstra(int s){
fill(d,d+maxn,INF);
//memset(d, 0x3f,sizeof d);
d[s]=0;
for(int i=0;i<n;i++){
int u=-1,minx=INF;
for(int j=1;j<=n;j++){
if(vis[j]==false && d[j]<minx){
u=j;
minx=d[j];
}
}
if(u==-1) return;
vis[u]=true;
for(int v=1;v<=n;v++){
if(vis[v]==false&&g[u][v]!=INF&&d[u]+g[u][v]<d[v]){
d[v]=g[u][v]+d[u];
}
}
}
}
int main(){
cin>>n>>m;
fill(g[0],g[0]+maxn*maxn,INF);
// memset(g,0x3f,sizeof g);
for(int i=0;i<m;i++){
int x,y,z;
cin>>x>>y>>z;
g[x][y]=min(g[x][y],z);
}
dijkstra(1);
if(d[n]!=INF)
cout<<d[n];
else cout<<"-1";
return 0;
}