练习KRUSKAL算法,不过却看出我读题目的不细心!
/*
* HDU-1233 还是畅道工程
* mike-w
* 2011-8-15
* hint: MST->kruskal
* PS: 村庄从1开始计数,使我WA无数 :(
* C要比GCC快许多!!!WHY!!!
*/
#include<stdio.h>
#include<stdlib.h>
#define MAXNE 5000
#define MAXNV 100
typedef struct _edge
{
int s,t,l;
}edge;
edge e[MAXNE];
int set[MAXNV];
int ne,nv,op,len;
int comp(const void* a1,const void* a2)
{
return ((edge*)a1)->l - ((edge*)a2)->l;
}
int mkset(int size)
{
int i;
for(i=1;i<=size;i++)
set[i]=-1;
return 0;
}
int find(int a)
{
int t1=a,root;
while(set[t1]>0)
t1=set[t1];
root=t1;
while(set[a]>0)
{
t1=set[a];
set[a]=root;
a=t1;
}
return root;
}
int merge(int a1,int a2)
{
int r1=find(a1),r2=find(a2);
if(r1==r2)
return 0;
else if(set[r1]<set[r2])
set[r2]=r1;
else if(set[r1]>set[r2])
set[r1]=r2;
else
set[r1]--,set[r2]=r1;
return 1;
}
int main(void)
{
int i;
#ifndef ONLINE_JUDGE
freopen("1233.in","r",stdin);
#endif
while(scanf("%d",&nv),nv)
{
op=len=0;
ne=nv*(nv-1)/2;
mkset(nv);
for(i=0;i<ne;i++)
scanf("%d%d%d",&(e[i].s),&(e[i].t),&(e[i].l));
qsort(e,ne,sizeof(edge),comp);
for(i=0;i<ne&&op<nv;i++)
if(merge(e[i].s,e[i].t))
{
len+=e[i].l;
op++;
}
printf("%d\n",len);
}
return 0;
}
本文深入探讨了KRUSKAL算法在解决最小生成树问题时的实现细节,作者通过实例展示了在阅读题目时的粗心导致的错误,并提供了优化策略。文章还对比了C和GCC编译器的性能差异,强调了选择合适编译器的重要性。
854

被折叠的 条评论
为什么被折叠?



