研究了半天,利用Kruskal结合并查集搞定了最小生成树,代码感觉还是很清晰的。
//John的农场(最小生成树).cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct Node
{
int v1,v2;
int weight;
}node[190];
int r[100001];
int find(int x)
{
while(r[x]!=x)
x=r[x];
return x;
}
int bing(int x,int y)
{
x=find(x);
y=find(y);
if (x==y)
return 0;
r[x]=y;
return 1;
}
int cmp(const void *p,const void *q)
{
int c=(*(Node*)p).weight - (*(Node*)q).weight;
if(c>0) return 1;
else return -1;
}
int kruskal(Node *node,int chosed,int size_v)
{
int weight=0,i=0;
while(chosed<size_v-1)
{
if(bing(node[i].v1,node[i].v2))
{
weight+=node[i].weight;
chosed++;
}
i++;
}
return weight;
}
int main()
{
int K;
cin>>K;
while(K--)
{
int weight,size_v,size_e=0,chosed=0;
cin>>size_v;
for(int i=0;i<100001;i++)
r[i]=i;
for(int i=0;i<size_v;i++)
{
for(int j=0;j<size_v;j++)
{
cin>>weight;
if(j>i && weight!=0)
{
node[size_e].v1=i;
node[size_e].v2=j;
node[size_e++].weight=weight;
}
}
}
qsort(node,size_e,sizeof(node[0]),cmp);//根据结构体中weight的值进行排序
cout<<kruskal(node,chosed,size_v)<<endl;
}
}