给定一个 nn 个点 mm 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。
请你求出 11 号点到 nn 号点的最短距离,如果无法从 11 号点走到 nn 号点,则输出 −1−1。
输入格式
第一行包含整数 nn 和 mm。
接下来 mm 行每行包含三个整数 x,y,zx,y,z,表示存在一条从点 xx 到点 yy 的有向边,边长为 zz。
输出格式
输出一个整数,表示 11 号点到 nn 号点的最短距离。
如果路径不存在,则输出 −1−1。
数据范围
1≤n,m≤1.5×1051≤n,m≤1.5×105,
图中涉及边长均不小于 00,且不超过 1000010000。
输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出样例:
3
#include<bits/stdc++.h>
#define lu pair<int,int>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 2e5;
struct node
{
int v,next,w;
}edge[maxn];
int cnt;
bool vis[maxn];
int dis[maxn],head[maxn];
void add(int u,int v,int w)
{
edge[cnt].w=w;
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void dijkstra(int n)
{
priority_queue<lu,vector<lu>,greater<lu>>q;
memset(dis,inf,sizeof dis);
q.push({0,1});
dis[1]=0;
while(!q.empty())
{
lu temp = q.top();
q.pop();
int u = temp.second;
if(vis[u]) continue;
vis[u]=true;
for(int i = head[u];i!=-1;i=edge[i].next)
{
int v = edge[i].v;
if(dis[v]>dis[u]+edge[i].w)
{
dis[v]=dis[u]+edge[i].w;
q.push({dis[v],v});
}
}
}
if(dis[n]==inf) cout<<-1<<endl;
else cout<<dis[n]<<endl;
}
int main()
{
int n,m,u,v,w;
cin>>n>>m;
memset(head,-1,sizeof(head));
for(int i = 0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
dijkstra(n);
return 0;
}