同ACM10583。
這次用weightedunion + collapsingfind去解。
原本直接把第一行吃掉不處理,
結果一直WA……
後來吃掉第一行並做處理後就AC了 =.=。
這測資有問題……可能是m後面不只m行……
心機啊!
/* ACM 10608 Friends * mythnc * 2012/01/14 23:12:34 * run time: 0.076 */ #include <stdio.h> #define MAXNODE 30001 void init(int); void input(int); int collapsingfind(int); void weightedunion(int, int); int count(int); int node[MAXNODE]; int main(void) { int n, m, set; scanf("%d", &set); while(set--) { scanf("%d %d", &n, &m); init(n); input(m); printf("%d\n", count(n)); } return 0; } /* init: initialize each node to different sets */ void init(int n) { int i; for (i = 1; i <= n; i++) node[i] = -1; } void input(int n) { int i, v1, v2; for (i = 0; i < n; i++) { scanf("%d %d", &v1, &v2); weightedunion(collapsingfind(v1), collapsingfind(v2)); } } /* collapsingfind: find root first, * then use collapsing rule to collapse all nodes * form v to root. return the set of node v */ int collapsingfind(int v) { int root, trail, tmp; for (root = v; node[root] >= 0; root = node[root]) ; for (trail = v; trail != root; trail = node[trail]) { tmp = trail; node[tmp] = root; } return root; } /* weightedunoin: union s1 and s2 */ void weightedunion(int s1, int s2) { if (s1 == s2) return; if (s1 <= s2) { node[s1] += node[s2]; node[s2] = s1; } else { node[s2] += node[s1]; node[s1] = s2; } } /* count: return the max nodes set */ int count(int n) { int min, i; for (i = 1, min = -1; i <= n; i++) if (node[i] < min) min = node[i]; return -min; }
沒有留言:
張貼留言