Dijkstra+最小堆(heap) #include<stdio.h> #define MAX 1000000 #define MAXX 1000000000 struct edge{ int to; long long val; int next; }e[MAX+1],re[MAX+1]; int vex[MAX+1]; int rvex[MAX+1]; int final[MAX+1]; long long D[MAX+1]; long long dui[2*MAX+1][2]; int sizenum=0; void adjust(int i); void insert(int a0,long long a1); int dele() { int i; int k=1; i=dui[k][0]; dui[k][0]=dui[sizenum][0]; dui[k][1]=dui[sizenum][1]; sizenum--; adjust(k); return i; } void adjust(int i) { int k=i;long long m;long long n; if(dui[2*k][1]>=dui[2*k+1][1]&&2*k+1<=sizenum) if(dui[2*k+1][1]<dui[k][1]) { m=dui[k][0],n=dui[k][1]; dui[k][0]=dui[2*k+1][0],dui[k][1]=dui[2*k+1][1]; dui[2*k+1][0]=m,dui[2*k+1][1]=n; adjust(2*k+1); } if(2*k==sizenum||(dui[2*k][1]<dui[2*k+1][1]&&2*k+1<=sizenum)) { if(dui[2*k][1]<dui[k][1]) { m=dui[k][0],n=dui[k][1]; dui[k][0]=dui[2*k][0],dui[k][1]=dui[2*k][1]; dui[2*k][0]=m,dui[2*k][1]=n; adjust(2*k); } } } void insert(int a0,long long a1) { sizenum++; dui[sizenum][0]=a0; dui[sizenum][1]=a1; int k=sizenum; while(k/2>0&&dui[k/2][1]>dui[k][1]) { long long m;long long n; m=dui[k/2][0],n=dui[k/2][1]; dui[k/2][0]=dui[k][0],dui[k/2][1]=dui[k][1]; dui[k][0]=m,dui[k][1]=n; k/=2; } } long long djj(struct edge e[],int vex[],int p,int q) { int i,j;long long sum=0; sizenum=0; for(i=1;i<=p;i++) { final[i]=0;D[i]=MAXX; } int k=vex[1]; for(j=1;k!=0;j++) { if(D[e[k].to]>e[k].val)D[e[k].to]=e[k].val,insert(e[k].to,e[k].val); k=e[k].next; } D[1]=0;final[1]=1; for(i=1;i<p;i++) { int v; int min; v=dele(); while(final[v]==1)v=dele(); min=D[v]; final[v]=1;sum+=min; int k=vex[v]; int x; for(x=1;k!=0;x++) { if(D[e[k].to]>e[k].val+min&&final[e[k].to]==0) { D[e[k].to]=e[k].val+min; insert(e[k].to,e[k].val+min); } k=e[k].next; } } return sum; } int main() { int k; scanf("%d",&k); while(k--) { int i; int p,q; scanf("%d%d",&p,&q); for(i=1;i<=p;i++)vex[i]=0,rvex[i]=0; for(i=0;i<=q;i++)e[i].next=0,re[i].next=0; i=1; while(i<=q) { int s,t;long long v; scanf("%d%d%lld",&s,&t,&v); e[i].to=t;re[i].to=s; e[i].val=v;re[i].val=v; e[i].next=vex[s];re[i].next=rvex[t]; vex[s]=i;rvex[t]=i; i++; } printf("%lld/n",djj(e,vex,p,q)+djj(re,rvex,p,q)); } return 0; }