| ||||||||||
| 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 | |||||||||
终于找出BUG~~,用有BUG的堆模板 居然AC了那么多题~~In Reply To:Dj+heap,heap改成在线形式就不对了?(而不是一来就设定n个node,赋值无穷大那种) Posted by:entrails at 2007-09-07 00:04:53 > 程序哪里有BUG啊??
>
> #include <stdio.h>
> #include <memory.h>
> #include <stdlib.h>
> #define MaxN 1001
> #define INF 0x7FFFFFFF
>
> struct HEAPtype { int h2n,vop; } heap[MaxN];
> int n2h[MaxN],hn;
> int Better(int ax,int bx)
> {
> if (ax<bx) return 1;
> return 0;
> }
> int HeapSwap(int ix,int jx)
> {
> int temp;
> int vx,ux;
> temp=heap[ix].vop; heap[ix].vop=heap[jx].vop; heap[jx].vop=temp;
> vx=heap[ix].h2n;
> ux=heap[jx].h2n;
> temp=n2h[vx]; n2h[vx]=n2h[ux]; n2h[ux]=temp;
> temp=heap[ix].h2n; heap[ix].h2n=heap[jx].h2n; heap[jx].h2n=temp;
> return 0;
> }
> int Heapfy(int ix)
> {
> int jx;
> if (hn==0) return 0;
> /*up adjust*/
> jx=0;
> while (ix/2>=1 && Better(heap[ix].vop,heap[ix/2].vop))
> {
> HeapSwap(ix,ix/2);
> ix=ix/2;
> jx=1;
> }
> if (jx) return 1;
> /*else,down adjust*/
> jx=ix;
> do
> {
> ix=jx;
> if (ix*2<=hn && Better(heap[ix*2].vop,heap[ix].vop)) jx=ix*2;
> if (ix*2+1<=hn && Better(heap[ix*2+1].vop,heap[ix].vop)) jx=ix*2+1;
> if (ix!=jx) HeapSwap(ix,jx);
> }
> while (ix!=jx);
> return 0;
> }
> int Relax(int ix,int wt,int jx)
> {
> if (Better(heap[ix].vop+wt,heap[jx].vop))
> {
> heap[jx].vop=heap[ix].vop+wt;
> Heapfy(jx);
> }
> return 0;
> }
>
> struct NODE
> {
> int ID,EW;
> struct NODE * Next;
> };
> struct NODE al[MaxN],*pn;
>
> int dest;
> int i,j;
> int n,m;
> int u,v;
> int wtx;
>
> int Dijkstra(int sv,int tv)
> {
> /*Initialize Heap*/
> memset(heap,0,sizeof(heap));
> memset(n2h,-1,sizeof(n2h));
> hn=1;
> n2h[sv]=hn;
> heap[n2h[sv]].vop=0;
> heap[n2h[sv]].h2n=sv;
> while (hn)
> {
> if (heap[1].h2n==tv) return heap[1].vop;
> u=heap[1].h2n;
> heap[0].vop=heap[1].vop;
> HeapSwap(1,hn);
> n2h[u]=0;
> hn--;
> Heapfy(1);
> pn=al[u].Next;
> while (pn!=NULL)
> {
> if (n2h[pn->ID]==-1)
> {
> hn++;
> n2h[pn->ID]=hn;
> heap[n2h[pn->ID]].vop=INF;
> heap[n2h[pn->ID]].h2n=pn->ID;
> }
> if (n2h[pn->ID]) Relax(0,pn->EW,n2h[pn->ID]);
> pn=pn->Next;
> }
> }
> return 0;
> }
> int main()
> {
> while (scanf("%d%d",&m,&n)!=EOF)
> {
> memset(al,NULL,sizeof(al));
> for (i=1;i<=m;i++)
> {
> scanf("%d%d%d",&u,&v,&wtx);
> pn=(struct NODE*)malloc(sizeof(struct NODE));
> pn->ID=v;
> pn->EW=wtx;
> pn->Next=al[u].Next;
> al[u].Next=pn;
> pn=(struct NODE*)malloc(sizeof(struct NODE));
> pn->ID=u;
> pn->EW=wtx;
> pn->Next=al[v].Next;
> al[v].Next=pn;
> }
> dest=Dijkstra(n,1);
> printf("%d",dest);
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator