dijkstra补充
dijkstra主要写法:
priority_queue<pair<int,int> >q; //大根堆 //dis第一维为dis的相反数 void dijkstra(){ memset(dis,inf,sizeof dis); memset(vis,0,sizeof vis); dis[1]=0; q.push(make_pair(0,1)); while(q.size()){ int u=q.top().second;q.pop(); if(vis[u]) continue; vis[u]=1; for(int i=head[u];i;i=e[i].next){ int v=e[i].v,w=e[i].w; if(dis[v]>dis[u]+w) dis[v]=dis[u]+w; q.push(make_pair(-dis[v],v)); } } }
pair以first为关键字,那么可以放置相反数转换根堆为小根堆
测试:
#include<bits/stdc++.h> using namespace std; int n,a[100]; priority_queue<pair<int,int> > q; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; q.push(make_pair(a[i],i) ); } while(q.size()){ printf("%d %d\n",q.top().first,q.top().second); q.pop(); } return 0; }
//5 输入
//1 9 6 4 8
//9 2 输出
//8 5
//6 3
//4 4
//1 1