Dijkstra Minimum Heap
#include <cstdio>#include<cstring>#include<cmath>#include<map>#include<queue>#include<algorithm>using namespacestd;Const Long Longinf=9999999999999;Const intmaxn=2e5+Ten;structx{intID; Long LongTime,cost; BOOL operator< (ConstX &a)Const { if(Time==a.time)returnCost>A.cost; returnTime>A.time; } X (intFLong LongGLong Longh) {ID=f,time=g,cost=h; }};structedge{int from, to; Long LongTime,cost; intNext;} S[MAXN];intHEAD[MAXN];BOOLFLAG[MAXN];Long LongAns1,ans2;Long LongDIS[MAXN];intMain () {intT,n,m; scanf"%d",&T); while(t--) {scanf ("%d%d",&n,&m); memset (Head,-1,sizeofhead); memset (Flag,0,sizeofflag); Ans1=ans2=0; for(intI=0; i<=n;i++) dis[i]=INF; intCnt=0; for(intI=1; i<=m;i++) { intu,v; Long LongTime,cost; scanf ("%d%d%lld%lld",&u,&v,&time,&Cost ); S[CNT]. from=u,s[cnt].to=v,s[cnt].time=time,s[cnt].cost=Cost ; S[cnt].next=head[u],head[u]=cnt++; S[CNT]. from=v,s[cnt].to=u,s[cnt].time=time,s[cnt].cost=Cost ; S[cnt].next=head[v],head[v]=cnt++; } priority_queue<X>Q; Q.push (X (0,0,0)); dis[0]=0; while(!Q.empty ()) {X h=q.top (); Q.pop (); if(flag[h.id]==1)Continue; Flag[h.id]=1; Ans1=ans1+h.time; ans2=ans2+H.cost; for(inti=head[h.id];i!=-1; i=S[i].next) { if(flag[s[i].to]==0&&dis[s[i].to]>=dis[h.id]+s[i].time) {Dis[s[i].to]=dis[h.id]+S[i].time; Q.push (X (s[i].to,dis[h.id)+s[i].time,s[i].cost)); }}} printf ("%lld%lld\n", ANS1,ANS2); } return 0;}
ZOJ 3946 Highway Project