ZOJ-2740

来源:互联网 发布:知乎三角铁十级什么梗 编辑:程序博客网 时间:2024/06/01 10:42

题目的意思就是给出一些边,问这些边组成的图是否是一棵树,就是无环并且全连通,如果是树的话,那边肯定为顶点数减一,然后用并查集加边,如果加入边形成了环,就不是树,否则一直加直到每条边都加上,刚好为一棵树

#include<stdio.h>#include<stdlib.h>struct Computer{struct Computer *parent;int rank;};static struct Computer *make_set(){struct Computer *v = malloc(sizeof(struct Computer));v->parent = v;v->rank = 0;return v;}static struct Computer *find_set(struct Computer *v){if (v->parent != v)v->parent = find_set(v->parent);return v->parent;}static void link(struct Computer *u, struct Computer *v){if (u->rank > v->rank)v->parent = u;else{u->parent = v;if (u->rank == v->rank)v->rank++;}}static void union_set(struct Computer *u, struct Computer *v){link(find_set(u), find_set(v));}int main(){int n, m, i;struct Computer **array = malloc(1000 * sizeof(struct Computer*));for (i = 0; i < 1000; i++)array[i] = make_set();while (scanf("%d %d", &n, &m), n){for (i = 0; i < n; i++){array[i]->parent = array[i];array[i]->rank = 0;}int a, b, flag = 1;if (n - 1 != m)flag = 0;for (i = 0; i < m; i++){scanf("%d %d", &a, &b);if (flag){struct Computer *c1 = find_set(array[a - 1]);struct Computer *c2 = find_set(array[b - 1]);if (c1 != c2)union_set(c1, c2);elseflag = 0;}}puts(flag ? "Yes" : "No");}for (i = 0; i < 1000; i++)free(array[i]);free(array);return 0;}


0 0
原创粉丝点击