| ||||||||||
| 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 | |||||||||
哪位好人帮忙一下啊In Reply To:为什么会WA,谁帮忙看看 Posted by:xiangsanzi at 2006-04-04 16:56:45 > /*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