HDU
来源:互联网 发布:淘宝代购服务点申请表 编辑:程序博客网 时间:2024/06/07 06:11
/* 思路来自blog: http://blog.csdn.net/qq_34374664/article/details/53492176 虽然并查集之前写过,但还是不熟,理解也不是太深刻,并查集中的压缩,更是没听过也不会写...好在有上面那个blog,讲解得十分细致 而且这个博主不止这一篇博文这样,我找了几篇他的知识点讲解,都是走的细致易懂风,很适合初学者...嗯,可以刷书刷到瓶颈期的时候,用他的博客接着学,真的很推荐他的blog 突然看到hdoj上有这么一句 Huge input, scanf is recommended. 那大家如果被卡TLE,就换成scanf吧!~*/
#include <iostream>#include <cstring>using namespace std;const int maxn = 1005;int N, M;int f[maxn]; // 用来记录对应的树根int num[maxn]; // num[i] 用来记录根节点为i的数据有几个,不过它最关键的作用是,统计有多少个相异的根节点int findx(int x){int t = x;while (t != f[t])t = f[t]; // 找到x的根//压缩int i = x, j;while (f[i] != t){j = f[i];f[i] = t;i = j;}return t;} void unite(int x, int y){x = findx(x);y = findx(y);if (x != y){f[y] = x;}}int main(){int i, a, b, ans;while (cin >> N >> M && N){for (i = 1; i <= N; i++)f[i] = i;for (i = 1; i <= M; i++){cin >> a >> b;unite(a, b);}memset(num, 0, sizeof(num));for (i = 1; i <= N; i++)num[findx(i)]++; //注意这里,一开始自己写的时候,错写成了 num[f[x]]++; 后来想明白了不能这样,因为是要找有多少个不同的根,所以在枚举城市的时候,是要找到他们的根,然后将数组对应位置++,果断该用findx()函数 for (ans = 0, i = 1; i <= N; i++)if (num[i])ans++;cout << --ans << endl;}return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- [BZOJ2656][ZJOI2012]数列(递推+高精)
- UVA
- poj3255 Roadblocks
- GCJ 2009 Round2 A Crazy Rows
- iptables高性能前端优化-无压力配置1w+条规则
- HDU
- 我做管理的半年总结
- poj3276 Face The Right Way
- UVA
- 通达oa破解版/通达oa破解补丁/最新通达oa破解补丁
- poj3061 Subsequence
- python爬虫学习
- poj3723 Conscription
- 计算三角面片的面积、体积