HDOJ 1232 畅通工程
题目传送:HDOJ 1232 畅通工程
解题思路:本题可以理解为一张无向图中给定部分连通分量,求多条连通分量间,需要至少多少条连线可以使图变为一条连通分量。对于无向图求连通分量个数问题,可以采用并查集的方法解决。
并查集:一种树形结构,常用于处理不相交集合的合并和查询问题。
相关链接:数据结构之并查集
本题代码:
#include <stdio.h> int father[1010]; int findFather(int a)//寻找结点的祖父结点 { while(father[a]!=a) a=father[a]; return a; } void merge(int x, int y)//祖父结点不同则合并 { int fx,fy; fx=findFather(x); fy=findFather(y); if(fx!=fy) father[fx]=fy; } int main() { int n,m,i,a,b,ans; while(scanf("%d", &n) && n!=0) { for(i=1;i<=n;i++) father[i]=i; scanf("%d", &m); for(i=1;i<=m;i++) { scanf("%d%d", &a, &b); merge(a, b); } ans=-1; for(i=1;i<=n;i++) if(i==father[i]) ans++; printf("%d\n", ans); } return 0; }