Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

终于找出BUG~~,用有BUG的堆模板 居然AC了那么多题~~

Posted by entrails at 2007-09-25 18:19:06 on Problem 2387
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator