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

神牛帮忙看一下为什么wa

Posted by xiyangyang790 at 2010-11-15 18:48:30 on Problem 3159
#include<cstdio>
const int maxn=30001, maxm=150002;
int n,m,E,d[maxn],first[maxn],next[maxm],point[maxm],value[maxm];
int len,heap[maxn],pla[maxn];
inline void Add_edge(int u,int v,int w){
	point[++E]=v;value[E]=w;next[E]=first[u];first[u]=E;
}
void swap(int a,int b){
	int t=heap[a];heap[a]=heap[b];heap[b]=t;
	pla[heap[a]]=a;pla[heap[b]]=b;
}
void up(int x){
	while(x>1&&d[heap[x]]<d[heap[x/2]])swap(x,x>>=1);
}
void down(int x){
	for(int min;x*2<=len;x=min){
		min=(x*2<len?(d[heap[x*2]]<d[heap[x*2+1]]?x*2:x*2+1):x*2);
		if(d[heap[min]]>=d[heap[x]])break;
		swap(x,min);
	}
}
int main(){
	//freopen("3159.in","rb",stdin);
	scanf("%d%d",&n,&m);
	for(int i=0,x,y,z;i<m;i++){
		scanf("%d%d%d",&x,&y,&z);
		Add_edge(x,y,z);
	}
	for(int i=2;i<=n;i++)d[i]=1061109567;
	for(int i=1;i<=n;i++)pla[heap[i]=i]=i;
	for(len=n;len;){
		int p=heap[1];
		swap(1,len--);
		down(1);
		for(int i=first[p];i;i=next[i])
			if(d[point[i]]>d[p]+value[i]){
				d[point[i]]=d[p]+value[i];
				up(pla[point[i]]);
			}
	}
	printf("%d\n",d[n]);
	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