POJ 1258 Agri-Net 【最小生成树入门题目】
原创
©著作权归作者所有:来自51CTO博客作者wx634fafb167087的原创作品,请联系作者获取转载授权,否则将追究法律责任
题意;
给出各个点之间的距离,求最小生成树。krual和prim都可以。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define mx 105
using namespace std;
int fa[mx],sum;
int n,ce;
struct aa{
int x,y,qu;
}ma[mx*mx]; //结构体数组开成2*mx大小,感觉自己是个智障
void init(){
// memset(vis, 0, sizeof(vis));
for(int i = 1; i < mx; i++ )
fa[i] = i;
sum=ce=0;
}
bool cmp(aa a,aa b){
return a.qu<b.qu;
}
int find(int x){
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
int main(){
while(scanf("%d",&n)!=EOF){
init();
for(int i = 1; i <=n; i++)
for(int j=1; j <= n; j++){
ma[ce].x = i;
ma[ce].y = j;
scanf("%d",&ma[ce].qu);
ce++;
}
sort(ma,ma+ce,cmp);
for(int i = 0; i < ce; i++){
int x = ma[i].x,y = ma[i].y, qu = ma[i].qu;
int a=find(x),b=find(y);
if(a == b) continue;
else{
fa[a] = b;
sum += qu;
}
}
cout<<sum<<endl;
}
return 0;
}