hdu 1231 畅通工程 并查集初步
来源:互联网 发布:mac微博客户端是什么 编辑:程序博客网 时间:2024/06/14 08:20
传送门:hdu 1231 畅通公路
中文题目就不做过多的解释了
解题思路
这个题目主要考察的并查集简单合并和查找,没有压缩路径。
但是在这里说一下路径压缩的两种方法(递归和非递归)
递归:
int find(int x){ return pre[x] = (x!=pre[x])?find(pre[x]):pre[x];}
非递归的就相对来说有点麻烦了
int find(int x){ int r = x;//保存下x这个值 while(r!=pre[r]) r = pre[r]; //一直找到x的根节点 int i = x,j; while(pre[i] != r ) //该节点不是根节点 { j = pre[i];//保存下这个节点 pre[i] = r;//把这个节点的父节点指向根节点 i = j;//把i变为以前的父节点 } return r;}
AC代码
#include<cstdio>#include<cstring>#define mst(a,b) memset(a,b,sizeof a);const int MAXN = 1e3+5;int pre[MAXN];int find(int x){ return pre[x] = (x!=pre[x])?find(pre[x]):pre[x];}void join(int x,int y){ int fx = find(x),fy = find(y); if(fx!=fy) pre[fx] = fy;}int main(){ int n,m; int a,b; int tmp[MAXN]; while(~scanf("%d",&n) && n) { scanf("%d",&m); for(int i=1;i<=n;i++)pre[i] = i; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); join(a,b); } mst(tmp,0); int ans = 0; for(int i=1;i<=n;i++) { tmp[find(i)]++; if(tmp[find(i)] == 1) ans++; } printf("%d\n",ans-1); } return 0;}
0 0
- hdu 1231 畅通工程 并查集初步
- hdu 1232 畅通工程 并查集
- HDU 1232 畅通工程 并查集
- HDU 1232 畅通工程 (并查集)
- hdu 1232畅通工程 并查集
- hdu 1232 畅通工程 并查集
- HDU--1232--畅通工程--并查集
- HDU--1863--畅通工程--并查集
- 畅通工程-并查集-hdu 1232
- hdu 1232 畅通工程并查集
- HDU 1232 畅通工程 并查集
- hdu 1232 畅通工程 并查集
- hdu 1232 畅通工程(并查集)
- HDU 1232 畅通工程(并查集)
- HDU 1232 畅通工程(并查集)
- HDU 1232 畅通工程 并查集
- 并查集:hdu 1232 畅通工程
- HDU - 1232 畅通工程 <并查集>
- opencv提取直线、轮廓及ROI的描述方法
- js中this的用法
- Sumsets
- POJ 2186 Popular Cows Kosaraju求强联通分量
- 帝国时代2 genied2 代码
- hdu 1231 畅通工程 并查集初步
- 构造函数与析构函数
- 快速幂+同余定理
- Leetcode--Some answer Links
- java reflect:反射机制
- 在Windows上安装Django框架
- 编程珠玑 Chapter2_B
- python opencv(7)图像平铺
- 筛素数法--模板