Dijktra算法堆优化版(mlogn)
/*
一些语法问题:
vec版邻接表
vector<PII> u[N];
优先队列
priority_queue<PII, vector<PII>, greater<PII>> heap;
queue的用法
PII uu=heap.top();
heap.pop();
核心:
优先队列优化了选点过程
稀疏图:邻接表
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 1e5+10;
int n,m;
int dist[N];
int st[N];
typedef pair<int, int> PII;
vector<PII> u[N];
priority_queue<PII, vector<PII>, greater<PII>> heap;
int dijkstra()
{
memset(dist, 0x3f3f3f3f, sizeof dist);
heap.push({0,1});
dist[1]=0;
while(heap.size())
{
PII uu=heap.top();
heap.pop();
int id=uu.second;
if(st[id]) continue;
st[id]=1;
int len=u[id].size();
for(int i=0;i<len;i++)
{
int j=u[id][i].first;
int d=u[id][i].second;
if(dist[id]+d<dist[j])
{
dist[j]=min(dist[j],dist[id]+d);
heap.push({dist[j],j});
}
}
}
if(dist[n]==0x3f3f3f3f) return -1;
return dist[n];
}
int main()
{
cin>>n>>m;
while (m -- )
{
int x,y,z;
cin>>x>>y>>z;
u[x].push_back({y,z});
}
int dd=dijkstra();
cout<<dd<<endl;
return 0;
}