dijkstra模版
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; const int INF=1e9+10; struct Edge { int u,v,w; }; struct Dijkstra { int n,m; vector<Edge> edges; vector<int> G[maxn]; bool done[maxn]; int d[maxn]; int p[maxn]; void init(int n) { this->n=n; REP(i,1,n) G[i].clear(); edges.clear(); } void addedge(int u,int v,int w) { edges.push_back({u,v,w}); m=edges.size(); G[u].push_back(m-1); } struct HeapNode { int d,u; friend bool operator<(HeapNode A,HeapNode B) { return A.d>B.d; } }; void dijkstra(int s) { priority_queue<HeapNode> q; REP(i,1,n) d[i]=INF; d[s]=0; MS0(done); q.push({0,s}); while(!q.empty()){ HeapNode x=q.top();q.pop(); int u=x.u; if(done[u]) continue; done[u]=1; for(int i=0;i<G[u].size();i++){ Edge &e=edges[G[u][i]]; if(d[e.v]>d[u]+e.w){ d[e.v]=d[u]+e.w; p[e.v]=G[u][i]; q.push({d[e.v],e.v}); } } } } };Dijkstra dijk;
没有AC不了的题,只有不努力的ACMER!