HDU 1232 畅通工程(并查集)

来源:互联网 发布:淘宝翰哥只卖正品 编辑:程序博客网 时间:2024/06/08 05:14




http://acm.hdu.edu.cn/showproblem.php?pid=1232







分析:

找到有几个单独的连通区域  就知道要修几条路了





AC代码:

#include <stdio.h>int pre[1005];int find(int x){int r=x;while (pre[r]!=r){r=pre[r];}int i=x;int temp;while (i!=r){temp=pre[i];pre[i]=r;i=temp;}return r;}void join(int x,int y){int fx=find(x);int fy=find(y);if(fx!=fy){pre[fx]=fy;} }int main (){int n,m;while (scanf ("%d%d",&n,&m)&&n){int a,b;for (int i=1;i<=n;i++){pre[i]=i;//          初始化 }for (int i=0;i<m;i++){scanf ("%d%d",&a,&b);join(a,b);}int sum=0;for (int i=1;i<=n;i++){if(find(i)==i)//           有多少的根节点(即有多少连通区域) sum++;}printf ("%d\n",sum-1);//       修路条数等于连通区域减一 }return 0;}


原创粉丝点击