这个题,我做的时候忽然有点和prime混了。
首先Kruskal不需要一个visit数组,用并查集判断父亲节点是否相同,就可以完全解决这个问题。
而prime则需一个visit数组来进行记录访问与否
代码如下:
#include <iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 110
#define repf(i,from,to) for(int i =from ; i<to ; i++)
#define ll long long
int pre[MAX];
struct Node{
int a ,b,l ;
}nodes[MAX*MAX/2];
int M ,N ;
bool cmp(Node a ,Node b)
{
return a.l<b.l;
}
int Find(int x)
{
if(x!=pre[x])
{
pre[x]=Find(pre[x]);
}
return pre[x];
}
int main(){
while(~scanf("%d",&N)&&N)
{
int res = 0 ;
for(int i = 1; i <=N;i++)
{
pre[i]=i;
}
int index = 0 ,a,b,flag,d;
N = N*(N-1)/2;
while(N--)
{
scanf("%d %d %d %d",&a,&b,&d,&flag);//这个地方千万不要写成 scanf("%d %d %d",&nodes[index].a,&nodes[index].b,&nodes[index].l);,这样的话会错位,至于原因还不清楚
if(flag==1)
{
int fa = Find(a);
int fb = Find(b);
if(fa!=fb)
pre[fa]=fb;
}else {
nodes[index].a =a ; nodes[index].b = b ; nodes[index++].l = d ;
}
//cout << nodes[index-1].a <<"+"<<nodes[index-1].b<<endl;
}
sort(nodes,nodes+index,cmp);
repf(i,0,index)
{
int fa = Find(nodes[i].a);
int fb = Find(nodes[i].b);
if(fa!=fb)
{
pre[fa]=fb;
res += nodes[i].l;
}
}
printf("%d\n",res);
}
return 0 ;
}