Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
为什么这个Dijkstra+heap会WA#include<cstdio> #define maxn 30001 using namespace std; struct link { int nd,wei; link* nx; }; link* G[maxn]; int d[maxn],hp[maxn],hpos[maxn],n,m,hsize; void add(int a,int b,int w) { link* p=new link; p->nd=b;p->wei=w;p->nx=G[a];G[a]=p; } void swap(int a,int b) { int t=hp[a];hp[a]=hp[b];hp[b]=t; hpos[hp[a]]=a;hpos[hp[b]]=b; } void up(int L) { int p=L>>1; while((p>0)&&(d[hp[L]]<d[hp[p]])) { swap(L,p); L=p;p=L<<1; } } void down(int L) { int left,right,min; do { left=L<<1;right=left+1; if((left<=hsize)&&(d[hp[left]]<d[hp[L]])) min=left; else min=L; if((right<=hsize)&&(d[hp[right]]<d[hp[min]])) min=right; if (min==L) return ; swap(L,min); L=min; }while(1); } void makegraph() { int a,b,c,i; scanf("%d%d",&n,&m); for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); } } int main() { makegraph(); int i,t,max; link* L; for (i=1;i<=n;i++) { hp[i]=i;hpos[i]=i;d[i]=0x7FFFFFFF; } d[1]=0; hsize=n; for(i=1;i<n;i++) { t=hp[1];hp[1]=hp[hsize--];down(1); for(L=G[t];L!=NULL;L=L->nx) { if (d[t]+L->wei<d[L->nd]) { d[L->nd]=d[t]+L->wei; up(hpos[L->nd]); } } } for(max=0,i=1;i<=n;i++) if (d[i]>max) max=d[i]; printf("%d\n",max); return 0; } 自己拿pascalA掉了,改成c++就WA Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator