克鲁斯卡尔最小生成树,该如何解决
克鲁斯卡尔最小生成树
HDOJ 1233 继续畅通工程 http://acm.hdu.edu.cn/showproblem.php?pid=1233 我用克鲁斯卡尔做的,实在不知道哪里WA的,求大神帮忙看看WA在哪里,谢谢,刚才发过一次不小心忘放代码就发出去了,果断被删了,太囧了,这是我的WA的代码:
#include<cstdio>
#include<cstdlib>
#define MAXN 110
#define MAXM 6050
int m,n;
struct edge
{
int x;
int y;
int w;
}edges[MAXM];
int parent[MAXN];
void UFset()
{
for(int i=0;i<=MAXN;i++)
parent[i]=-1;
}
int find(int x)
{
int s;
for(s=x;parent[s]>=0;s=parent[s])
while(x!=s)
{
int temp=parent[x];
parent[x]=s;
x=temp;
}
return s;
}
void Union(int r1,int r2)
{
int R1=find(r1),R2=find(r2);
int temp=parent[R1]+parent[R2];
if(parent[R1]>parent[R2])
{
parent[R1]=R2;
parent[R2]=temp;
}
else
{
parent[R2]=R1;
parent[R1]=temp;
}
}
int cmp(const void * a,const void * b)
{
edge aa=*(edge *)a;
edge bb=*(edge *)b;
return aa.w-bb.w;
}
void kruskal()
{
UFset();
int weight=0;
for(int i=1;i<=m&&n>1;i++)
{
if(find(edges[i].x)!=find(edges[i].y))
{
weight+=edges[i].w;
Union(edges[i].x,edges[i].y);
n--;
}
}
printf("%d\n",weight);
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
m=n*(n-1)/2;
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&edges[i].x,&edges[i].y,&edges[i].w);
}
qsort(edges,m,sizeof(edges[0]),cmp);
kruskal();
}
}
------解决方案--------------------
qsort(edges+1,m,sizeof(edges[0]),cmp);
改一下就ok了
像这种简单问题学会自己调试,不要动不动贴代码,对你的编码能力调试能力没有提高的
HDOJ 1233 继续畅通工程 http://acm.hdu.edu.cn/showproblem.php?pid=1233 我用克鲁斯卡尔做的,实在不知道哪里WA的,求大神帮忙看看WA在哪里,谢谢,刚才发过一次不小心忘放代码就发出去了,果断被删了,太囧了,这是我的WA的代码:
#include<cstdio>
#include<cstdlib>
#define MAXN 110
#define MAXM 6050
int m,n;
struct edge
{
int x;
int y;
int w;
}edges[MAXM];
int parent[MAXN];
void UFset()
{
for(int i=0;i<=MAXN;i++)
parent[i]=-1;
}
int find(int x)
{
int s;
for(s=x;parent[s]>=0;s=parent[s])
while(x!=s)
{
int temp=parent[x];
parent[x]=s;
x=temp;
}
return s;
}
void Union(int r1,int r2)
{
int R1=find(r1),R2=find(r2);
int temp=parent[R1]+parent[R2];
if(parent[R1]>parent[R2])
{
parent[R1]=R2;
parent[R2]=temp;
}
else
{
parent[R2]=R1;
parent[R1]=temp;
}
}
int cmp(const void * a,const void * b)
{
edge aa=*(edge *)a;
edge bb=*(edge *)b;
return aa.w-bb.w;
}
void kruskal()
{
UFset();
int weight=0;
for(int i=1;i<=m&&n>1;i++)
{
if(find(edges[i].x)!=find(edges[i].y))
{
weight+=edges[i].w;
Union(edges[i].x,edges[i].y);
n--;
}
}
printf("%d\n",weight);
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
m=n*(n-1)/2;
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&edges[i].x,&edges[i].y,&edges[i].w);
}
qsort(edges,m,sizeof(edges[0]),cmp);
kruskal();
}
}
------解决方案--------------------
qsort(edges+1,m,sizeof(edges[0]),cmp);
改一下就ok了
像这种简单问题学会自己调试,不要动不动贴代码,对你的编码能力调试能力没有提高的