HDU 1102 Kruskal

来源:互联网 发布:多媒体显示屏播放软件 编辑:程序博客网 时间:2024/06/01 18:42

一开始边开少了,结果RE了一次。改了一下边的大小就过了

Kruskal算法就是找边,先把边都存起来,然后排序,挨个查找并且利用并查集判断

#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;#define LLEN 102#define EDGELEN 10010int map[LLEN][LLEN];typedef struct edge{int u, v, w;}edge;edge e[EDGELEN];int p[LLEN];bool cmp(edge a, edge b) {return a.w < b.w;}void init(int n) {for(int i = 0; i <= n; i++) {p[i] = i;}}int find(int x) {return p[x] == x ? x : (p[x] = find(p[x]));}int kruskal(int n, int q, int index) {int ans = 0;for(int i = 0; i < index; i++) {int t1 = find(e[i].u);int t2 = find(e[i].v);if(t1 != t2) {p[t1] = t2;ans += e[i].w;}}return ans;}int main() {int n, q;while(scanf("%d", &n) != EOF) {int index = 0;for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {scanf("%d", &map[i][j]);}}for(int i = 1; i <= n; i++) {for(int j = 1; j < i; j++) {e[index].u = i;e[index].v = j;e[index++].w = map[i][j];}}sort(e, e+index, cmp);init(n);scanf("%d", &q);for(int i = 0; i < q; i++) {int a, b;scanf("%d%d", &a, &b);int t1 = find(a);int t2 = find(b);if(t1 != t2) {p[t1] = t2;}}int ans = kruskal(n, q, index);printf("%d\n", ans);}return 0;}