最初,为了熟悉qsort用法,排序过程用了qsort,然后Floating Point Error 了7次。。。。。。终于,当我把可疑的地方找遍后,无果,于是果断放弃qsort,改为选择排序,终于出现了WA,天啊,第一次见到WA却是这么的高兴。。。后来,WA了5次,把可疑的地方找遍后,无果,于是果断放弃我引以自豪的输入时数据处理,改成平常的把所有数据都存起来。。。。。AC了。。
我去,改以前的代码找不到了!!!!!啊啊啊啊啊啊!太长了,也不写了,忘了吧,以后还是老实点,别想什么奇思妙想了。。。。。
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int x,y;
int w;
}NODE;
NODE node[3000];
int pre[55];
void change(int *x,int *y)//想用一次qsort吧还出错。。。。。。
{
int t;
t=*x;
*x=*y;
*y=t;
}
int find(int x)
{
while(x!=pre[x])
x=pre[x];
return x;
}
int kruskal(int k)
{
int i,j,a,b,h,sum=0;
for(i=0;i<k-1;i++)
{
h=i;
for(j=i+1;j<k;j++)
if(node[h].w>node[j].w)
h=j;
if(h!=i)
{
change(&node[i].x,&node[h].x);
change(&node[i].y,&node[h].y);
change(&node[i].w,&node[h].w);
}
}
for(i=0;i<k;i++) //感觉这次的kruskal写的有些感觉了
{
a=find(node[i].x);
b=find(node[i].y);
if(a!=b)
{
sum+=node[i].w;
pre[b]=a;
}
}
return sum;
}
int main()
{
int p,r,i,j;
while(scanf("%d",&p)&&p)
{
scanf("%d",&r);
for(i=0;i<=p;i++)
pre[i]=i;
for(i=0;i<r;i++)
scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].w);
printf("%d\n",kruskal(r));
}
return 0;
}