题目连接:http://poj.org/problem?id=1258
刚看到题目时感觉数据不好处理,后来发现把数据变化一下比较容易处理的方式,就是把个点和边长用结构
体表示,在用kruskal就OK了,就那么简单。
代码:
#include<stdio.h>
#include <iostream>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<list>
#include<vector>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
#define MAX 100010
int father[MAX];
struct node
{
int x;
int y;
int w;
}edge[MAX];
bool cmp(node o1,node o2)
{
return o1.w<o2.w;
}
int Find_Set(int x)
{
if(x!=father[x])
{
father[x]=Find_Set(father[x]);
}
return father[x];
}
int kruskal(int n)
{
int sum=0;
int i,fx,fy;
for(i=0;i<n;i++)
{
int fx=Find_Set(edge[i].x);
int fy=Find_Set(edge[i].y);
if(fx!=fy)
{
father[fx]=fy;
sum+=edge[i].w;
}
}
return sum;
}
int main()
{
int i,j,n,a[110][110];
while(scanf("%d",&n)!=EOF)
{
int k=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
if(i<j)
{
edge[k].x=i;
edge[k].y=j;
edge[k].w=a[i][j];
k++;
}
}
}
for(i=0;i<n;i++)
father[i]=i;
sort(edge,edge+k,cmp);
printf("%d\n",kruskal(k));
}
return 0;
}