标签:单源最短路径 【模板】
我的愚昧之处:priority_queue 是大根堆 !是大根堆!大根堆!
通过压入-dis将其转化为小根堆
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N = 100005;
const int M = 200005;
typedef pair<int,int>PII; //dis id
typedef long long ll;
priority_queue<PII>q;
int ne[M],to[M],w[M],head[N];
int c[N];
ll dis[N];
bool vis[N];
int cnt=0;
int n,m,u,v,d;
void add(int u,int v,int d)
{
cnt++;
ne[cnt]=head[u];
to[cnt]=v;
w[cnt]=d;
head[u]=cnt;
}
void Dijkstra(int s)
{
priority_queue<PII>q;
q.push(make_pair(0,1));
dis[1]=0;
while(!q.empty())
{
PII tmp=q.top();
q.pop();
int x=tmp.second;
if(vis[x]) continue;
vis[x]=true;
for(int i=head[x];i;i=ne[i])
{
int y=to[i];
if(dis[y]>dis[x]+w[i]+c[y])
{
dis[y]=dis[x]+w[i]+c[y];
if(!vis[y]) q.push(make_pair(-dis[y],y));
}
}
}
}
int main()
{
//freopen("D:\\vscode\\algorithm\\data.txt","r",stdin);
memset(dis,0X3f3f3f3f,sizeof dis);
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>c[i];
c[1]=c[n]=0;
for(int i=1;i<=m;++i)
{
cin>>u>>v>>d;
add(u,v,d);
add(v,u,d);
}
Dijkstra(1);
cout<<dis[n]<<endl;
return 0;
}