您的位置:首页 > 编程语言 > C语言/C++

POJ1258 Agri-Net 最小生成树 C语言

2011-07-20 16:25 489 查看
题目:http://poj.org/problem?id=1258

题目大意:多组测试用例,找出连接所有农场的最短路径。

算法:最小生成树 + 并查集。

提交情况:1次WA,1次RE,1次AC。

总结:没注意到多组用例;边集一定要开够。

思路:建立无向图,用上三角矩阵表示,并查集 + Kruskal建最小生成树,记录总长度。

AC code:

View Code

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <algorithm>

using namespace std;

#define MAX (100 + 10)

#define MAXN (100000 + 100)

typedef struct Graph {

int u, v, len;

} graph;

graph edge[MAXN];

int father[MAX];

int cnt = 0;

void Clear() {

memset(edge, 0, sizeof(edge));

memset(father, 0, sizeof(father));

}

int cmp(graph &a, graph &b) {

return a.len < b.len;

}

void Build_Map(int n) {

int i, j, k = 1;

int len;

for(i = 1; i <= n; i++) {

for(j = 1; j <= n; j++) {

scanf("%d", &len);

if (len && j > i) {

edge[k].u = i;

edge[k].v = j;

edge[k++].len = len;

cnt++;

}

}

father[i] = i;

}

}

int Find(int u) {

if(u != father[u])

father[u] = Find(father[u]);

return father[u];

}

void Union(int u, int v) {

father[u] = v;

}

int MLT() {

int road = 0;

int fu, fv;

int i, j;

for(i = 1; i <= cnt; i++) {

fu = Find(edge[i].u);

fv = Find(edge[i].v);

if (fu != fv) {

road += edge[i].len;

Union(fu, fv);

}

}

return road;

}

int main() {

int n;

while(~scanf("%d", &n)) {

Clear();

Build_Map(n);

sort(edge + 1, edge + cnt + 1,cmp);

printf("%d\n", MLT());

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: