dijkstra最短路手写堆

故事扮演 提交于 2019-11-26 12:14:14
真的只想说一点:细节!!!!!!delet的top--在哪写,还有down 里面的while(s<=top) 不要写成<=n!!!!!!!   s<top不要写成 s<n  我调了一个上午while(s<top)调了将近两个小时,结果忘改后边那个,,又改了一个小时,心态炸了,怎么老犯sd错误inline void swp(int &x,int &y){x^=y,y^=x,x^=y;}
inline void up(int p)
{
	while(p>1){
		if(heap[p]<heap[p>>1])   swp(heap[p],heap[p>>1]),swp(pn[p],pn[p>>1]);
		else break;
		p>>=1;
	}
}
inline void down(int p){
	int s=(p<<1);
	while(s<=top){
		if(s<top&&heap[s]>heap[s+1]) ++s;
		if(heap[s]<heap[p])   {swp(heap[s],heap[p]),swp(pn[s],pn[p]);}
		else break;
		p=s,s=(p<<1);
	}
}
inline void insert(int x,int y){ heap[++top]=x,pn[top]=y,up(top); }
inline void delet(){ heap[1]=heap[top],pn[1]=pn[top--];down(1); }
inline void djs()
{
	int x;
	dis[num[stx][sty]]=0;
	insert(0,num[stx][sty]);
	while(top)
	{	
		x=pn[1],delet();	
		if(mark[x])  continue;
		mark[x]=1;
		for(register int i=head[x];i;i=line[i].next)	
		{
			int v=line[i].to;
			if(dis[v]>dis[x]+line[i].w)   
			{
			
				dis[v]=dis[x]+line[i].w;	//cout<<dis[v]<<' '<<v<<"##########"<<endl;
				insert(dis[v],v);	
			}
		}
	}
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!