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 |
为什么会WA,谁帮忙看看/*pku 1751*/ #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 755 int coordinates[N][2]; int find[N]; int father[N]; int n,tree_num,out_num,find_num; struct CONNECT { int begin,end; int dis; }connect[N*N/2]; struct CREAT { int begin,end; }creat[N*N/2]; int find_father(int a) { if(father[a]!=a) father[a]=find_father(father[a]); return father[a]; } int cmp(const void *a,const void *b) { return (*(struct CONNECT *)a).dis-(*(struct CONNECT *)b).dis; } void kruskal() { int ii,jj,tmp1,tmp2,ans; ans=-1,jj=1; while(1) { while(1) { tmp1=find_father(connect[jj].begin); tmp2=find_father(connect[jj].end); if(tmp1!=tmp2)/*看他们是不是已经连在一起了里*/ break; else jj++; } father[tmp1]=tmp2; creat[++ans].begin=connect[jj].begin;/*将找到的边存起来,一次性输出*/ creat[ans].end=connect[jj].end; if(!find[creat[ans].begin]) { find[creat[ans].begin]=1; find_num++; } if(!find[creat[ans].end]) { find[creat[ans].end]=1; find_num++; } if(find_num==n) { out_num=ans; break; } } } int main() { int ii,jj,kk; int a,b,m; int d; int tmp1,tmp2; scanf("%d",&n); for(ii=1;ii<=n;ii++) father[ii]=ii,find[ii]=0; for(ii=1,kk=0;ii<=n;ii++) { scanf("%d%d",coordinates[ii],coordinates[ii]+1); for(jj=1;jj<ii;jj++) {/*求任意两点的距离*/ connect[++kk].dis=(coordinates[ii][0]-coordinates[jj][0])*(coordinates[ii][0]-coordinates[jj][0]) +(coordinates[ii][1]-coordinates[jj][1])*(coordinates[ii][1]-coordinates[jj][1]); connect[kk].begin=jj,connect[kk].end=ii; } } find_num=0; scanf("%d",&m); for(ii=1;ii<=m;ii++) { scanf("%d%d",&a,&b); if(!find[a]) { find[a]=1; find_num++; } if(!find[b]) { find[b]=1; find_num++; } tmp1=find_father(a); tmp2=find_father(b); if(tmp1!=tmp2) father[tmp1]=tmp2; } if(find_num==n)/*如果所有点都找到就退出*/ return 1; tree_num=kk; qsort(&connect[1],tree_num,sizeof(connect[1]),cmp);/*将所有的边按从小到大排列*/ kruskal(); for(ii=0;ii<=out_num;ii++) printf("%d %d\n",creat[ii].begin,creat[ii].end); return 1; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator