MST
求解用Krystal算法
题目详见Agri-Net
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define Maxn 105
#define Maxm 10000
using namespace std;
struct edge {
int from, to, weight;
}edges[Maxm];
int n, m; //n是点数,m是边数
int p[Maxn];
vector<edge> mst_edge;
int findroot(int num) {
if(p[num] != num) {
return findroot(p[num]);
}
return p[num];
}
int Krustal() {
int num = 0, weight = 0;
for(int i=0; i<m; i++) {
if(num == n-1) break;
int u = edges[i].from;
int v = edges[i].to;
int px = findroot(u);
int py = findroot(v);
if(px != py) {
num++;
p[py] = px;
weight += edges[i].weight;
mst_edge.push_back(edges[i]);
}
}
return weight;
}
void init() {
for(int i=0; i<n; i++) {
p[i] = i;
}
m = 0;
mst_edge.clear();
}
int cmp(edge edge1, edge edge2) {
return edge1.weight < edge2.weight;
}
int main(int argc, const char * argv[]) {
// insert code here...
while(cin>>n) { //这里如果用scanf会TLE
init();
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
int weight;
scanf("%d", &weight);
if(i < j) {
edges[m].from = i;
edges[m].to = j;
edges[m++].weight = weight;
}
}
}
sort(edges, edges+m, cmp);
int result = Krustal();
cout<<result<<endl;
}
return 0;
}
另一道MST树的题见The Unique MST