【九度OJ】:1526 并查集 朋友圈问题
2016-07-12 20:34
309 查看
假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友…),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。 假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋友圈,结果为2个朋友圈。
输入:
输入包含多个测试用例,每个测试用例的第一行包含两个正整数 n、m,1=<n,m<=100000。接下来有m行,每行分别输入两个人的编号f,t(1=<f,t<=n),表示f和t是好友。 当n为0时,输入结束,该用例不被处理。
输出:
对应每个测试用例,输出在这n个人里一共有多少个朋友圈。
样例输入:
5 3 1 2 2 3 4 5 3 3 1 2 1 3 2 3 0
样例输出:
2 1
详情见上一篇并查集详解,代码如下:
#include <iostream> #include <cmath> using namespace std; int pre[10000]; int find(int x){ int r = x; while(pre[r]!=r){ r = pre[r]; } //下面一些行是路径压缩的算法,把路过去的所有路径都折腾为直接子节点 int i = x;int j; while(i!=r){ j = pre[i]; pre[i] = r; i = j; } return r; } int main(){ int n,m,num1,num2,total; while(cin>>n){ for(int i=1;i<=n;i++){ pre[i] = i; //每个人都是掌门人 } total = n; cin>>m; while(m--){ cin>>num1>>num2; int f1 = find(num1); int f2 = find(num2); if(f1!=f2){ //错在了这里,应该是根节点之间的较量 pre[f1] = f2; total--; } } cout<<total<<endl; } return 0; }
相关文章推荐
- AVAudioRecord录音的使用
- adb shell dumpsys的使用
- Android 6.0以上系统webview的bug
- 转码工具native2ascii.exe的使用方法
- 判断网络连接状态
- JAVA多线程
- 自己写的分割字符串的函数
- HashMap—基本结构
- Scala 运算符
- 布局的调用
- Codeforces 360B + Codeforces 689C ( 二分 + DP )
- 【2012.03.3普及组】烤饼干
- ideaIU 16注册码分享
- MySQL分库分表总结
- 数据库创建
- kvm虚拟化技术应用实战
- HDU-1754-I Hate It(线段树 点更新求最值)
- POJ-1511 Invitation Cards( 最短路,spfa )
- 初步理解JS的事件机制
- json数据解析