[模板]Dijkstra求最短路 I
题目描述
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。
请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。
输入格式
第一行包含整数n和m。
接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。
输出格式
输出一个整数,表示1号点到n号点的最短距离。
如果路径不存在,则输出-1。
样例输入1
3 3
1 2 2
2 3 1
1 3 4
样例输出1
3
注释说明
1≤n≤500,
1≤m≤10^5,
图中涉及边长均不超过10000。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
int n,m,dis[505],state[505];
struct ed{
int to,w;
};
vector<ed>e[505];
void dijkstra(){
memset(dis,0x3f,sizeof(dis));
priority_queue<PII,vector<PII>,greater<PII> >q;
q.push((PII){0,1});
dis[1]=0;
while(!q.empty()){
int x=q.top().second;
q.pop();
if(state[x])continue;
state[x]=1;
for(int i=0;i<e[x].size();i++){
int to=e[x][i].to,w=e[x][i].w;
dis[to]=min(dis[to],w+dis[x]);
q.push((PII){dis[to],to});
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int z,y,x;
scanf("%d%d%d",&x,&y,&z);
e[x].push_back((ed){y,z});
}
dijkstra();
if(dis[n]<0||dis[n]>=0x3f3f3f3f)puts("-1");
else printf("%d\n",dis[n]);
}