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

求大牛指点,poj 3625,提交提示Runtime error

Posted by EmersonX at 2011-04-05 10:21:52
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int pi[1030];
struct abc
{
	int x;
	int y;
}point[1030];
struct bcd
{
	int v;
	int u;
	double rd;
}mst[101000];//u,v表示点的序号,rd表示点间距离,例如mst【i】记录第一个输入的和第二输入的点之间的信息,则v=1-1=0,u=2-1=1,rd为它们之间的距离(某点的序号=输入次序-1)
int cmp(const void *a,const void *b)
{
     struct bcd *aa=(struct bcd *)a;
     struct bcd *bb=(struct bcd *)b;
     return(((aa->rd)>(bb->rd))?1:-1);
}
int find(int x)
{
	return pi[x]==x?x:find(pi[x]);
}//并查集
double dic(int x1,int y1,int x2,int y2)
{
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}//两点间距离
int main()
{
	int n,m,i,j,hb[1030],z,q,p;//hb[]用来记录已经存在的路
	double ans=0;
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++)
		scanf("%d%d",&point[i].x,&point[i].y);
	for(i=0;m>0;m--)
		scanf("%d%d",&hb[i],&hb[i+1]);
	for(i=0;i<n;i++)
		pi[i]=i;//初始化并查集
	for(i=0,p=0;i<n;i++)
		for(j=i+1;j<n;j++,p++)
		{
			mst[p].rd=dic(point[i].x,point[i].y,point[j].x,point[j].y);
			mst[p].v=i;
			mst[p].u=j;
		}
	for(i=0;i<n;i=i+2)
	{
		z=find(hb[i]-1); 
		q=find(hb[i+1]-1);
		pi[z]=q;
	}//已经修好的路之间建立父子节点的关系
	qsort(mst,p,sizeof(struct bcd),cmp);//把mst按rd从小到大排序
	for(i=0;i<n;i++)
	{
		z=find(mst[i].u); 
		q=find(mst[i].v);
		if(z!=q)
		{
			ans+=mst[i].rd;
			pi[z]=q;
		}
	}
	printf("%.2lf\n",ans);
}

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