链接:http://poj.org/problem?id=1258
Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
解题思路: 最简单的最小生成树的题目;MST-Kruscal
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <string>
#include <iomanip>
#include <cassert>
#include <algorithm>
#define LC(x) (x<<1)
#define RC(x) (LC(x)+1)
#define PI (acos(-1))
#define EPS 1e-8
#define MAXN 111111
#define MAXM 222222
#define LL long long
#define ULL unsigned long long
#define INF 0x7fffffff
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;
struct edge {
int v, u, cost;
}e[111*111];
bool cmp_e(const edge &a, const edge &b)
{
return a.cost < b.cost;
}
int ecnt, fa[111], n, v;
void addedge(int u, int v, int cost)
{
e[++ ecnt].v = v, e[ecnt].u = u, e[ecnt].cost = cost;
}
int getf(int x)
{
return fa[x] == x ? x : fa[x] = getf(fa[x]);
}
int kruscal()
{
int sum = 0;
for(int i = 1; i <= n; i ++) fa[i] = i;
sort(e + 1, e + 1 + ecnt, cmp_e);
for(int i = 1; i <= ecnt; i ++) {
int u = e[i].u, v = e[i].v;
u = getf(u), v = getf(v);
if(u == v) continue;
sum += e[i].cost;
fa[u] = v;
}
return sum;
}
int main()
{
while(scanf("%d", &n) == 1) {
ecnt = 0;
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= n; j ++) {
scanf("%d", &v);
if(v != 0) addedge(i, j, v);
}
}
printf("%d\n", kruscal());
}
return 0;
}
POJ 1258 Agri-Net (MST-Kruscal),布布扣,bubuko.com
POJ 1258 Agri-Net (MST-Kruscal)
原文:http://blog.csdn.net/keshacookie/article/details/23115853