上周训练师有到题目,学长告诉的思路是dfs或并查集。在网上找到了我转载的那一篇并查集详解,很感谢原作者,讲解的很到位,而且很有趣。基本杭电的这道题就是求连通块的个数,因为连通块的个数减去1就是要修的路的条数。
代码:
#include <cstdio> int pre[1010]; int Find(int x) { int r=x; while(pre[r]!=r) r=pre[r]; int i=x, j; while(i!=r) { j=pre[i]; pre[i]=r ; i=j; } return r ; } int main() { int n, m, total, fa, fb, a, b; while(scanf("%d%d", &n, &m)!=EOF&&n) { total=n-1; for(int i=1; i<=n; i++) { pre[i]=i; } while(m--) { scanf("%d%d", &a, &b); fa=Find(a); fb=Find(b); if(fa!=fb) { pre[fa]=fb; total--; } } printf("%d\n", total); } return 0; }
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
1 0 2 998Huge input, scanf is recommended.HintHint