嗯,写最小生成树终于有感觉了,一次就AC了,比前两道好多了,不过,这次我没有用qsort,还是用了一般的排序,看来qsort是得好好学学了,这样,我的代码可以短很多,看着也会舒服了。。。
#include<stdio.h>
#include<string.h>
typedef struct
{
int x,y;
double w;
}NODE;
NODE node[10000];
int pre[5000];
void change1(int *x,int *y)
{
int t;
t=*x;
*x=*y;
*y=t;
}
void change2(double *x,double *y)
{
double t;
t=*x;
*x=*y;
*y=t;
}
int find(int x)
{
while(x!=pre[x])
x=pre[x];
return x;
}
void kruskal(int k,double total)
{
int i,j,a,b,h;
double sum=0.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)
{
change1(&node[i].x,&node[h].x);
change1(&node[i].y,&node[h].y);
change2(&node[i].w,&node[h].w);
}
}
for(i=0;i<k;i++)
{
a=find(node[i].x);
b=find(node[i].y);
if(a!=b)
{
sum+=node[i].w;
pre[b]=a;
}
}
if(sum>total)
printf("Not enough cable\n");
else
printf("Need %.1lf miles of cable",sum);
}
int main()
{
double total;
int i,j,house,paths,k;
char a[5000][25],b[25],c[25];
scanf("%lf%d",&total,&house);
for(i=1;i<=house;i++)
pre[i]=i;
for(i=1;i<=house;i++)
scanf("%s",a[i]);
scanf("%d",&paths);
for(i=0;i<paths;i++)
{
k=0;
scanf("%s%s%lf",b,c,&node[i].w);
for(j=1;j<=house;j++)
{
if(strcmp(b,a[j])==0)
{
node[i].x=j;
k++;
}
if(strcmp(c,a[j])==0)
{
k++;
node[i].y=j;
}
if(k==2)
break;
}
}
kruskal(paths,total);
return 0;
}
呵呵,不错不错,我改了一下,把qsort加了进去,没出现让人头疼的Floating Point Error ,这样代码看着就舒服了。。
#include<stdio.h>
#include<string.h>
typedef struct
{
int x,y;
double w;
}NODE;
NODE node[10000];
int pre[5000];
int cmp(const void *a,const void *b)
{
return ((NODE*)a)->w > ((NODE*)b)->w ? 1 : -1;
}
int find(int x)
{
while(x!=pre[x])
x=pre[x];
return x;
}
void kruskal(int k,double total)
{
int i,j,a,b,h;
double sum=0.0;
qsort(node,k,sizeof(NODE),cmp);
for(i=0;i<k;i++)
{
a=find(node[i].x);
b=find(node[i].y);
if(a!=b)
{
sum+=node[i].w;
pre[b]=a;
}
}
if(sum>total)
printf("Not enough cable\n");
else
printf("Need %.1lf miles of cable",sum);
}
int main()
{
double total;
int i,j,house,paths,k;
char a[5000][25],b[25],c[25];
scanf("%lf%d",&total,&house);
for(i=1;i<=house;i++)
pre[i]=i;
for(i=1;i<=house;i++)
scanf("%s",a[i]);
scanf("%d",&paths);
for(i=0;i<paths;i++)
{
k=0;
scanf("%s%s%lf",b,c,&node[i].w);
for(j=1;j<=house;j++)
{
if(strcmp(b,a[j])==0)
{
node[i].x=j;
k++;
}
if(strcmp(c,a[j])==0)
{
k++;
node[i].y=j;
}
if(k==2)
break;
}
}
kruskal(paths,total);
return 0;
}