并查集算法----犯罪团伙(黑科技)
一、题目描述
犯罪团伙(gang.cpp)
题目描述
警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。有可能一个犯罪团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。已知罪犯的编号从1至n。
输入
第1行:n(<=500,罪犯数量),m(<50000,关系数量)以下m行:每行两个数:i 和j,中间一个空格隔开,表示罪犯i和罪犯j相互认识。
输出
第1行:一个整数,犯罪团伙的数量。
样例输入
11 8
1 2
4 3
5 4
1 3
5 6
7 10
5 10
8 9
样例输出
3
二、分析
我最开始的想法是用图论算法,但是想了半天都没有思路,然后就用搜索算法来做,结果,一搜索就死循环。
最后干脆用循环来做,
基本思想(样例):
1 2 3 4 5 6 7 8 9 10 11(代表11 个人)
1 2 3 4 5 6 7 8 9 10 11(代表这11个人的老板)
输入:1 2 (理解为 2的老板是1)
1 2 3 4 5 6 7 8 9 10 11
1 1 3 4 5 6 7 8 9 10 11
输入:4 3 (理解为 3的老板是4)
1 2 3 4 5 6 7 8 9 10 11
1 1 4 4 5 6 7 8 9 10 11
输入:5 4 (理解为 4的老板是5)
1 2 3 4 5 6 7 8 9 10 11
1 1 5 5 5 6 7 8 9 10 11
......(以此类推)
最终结果:
1 2 3 4 5 6 7 8 9 10 11
1 1 1 1 1 1 1 8 8 1 11
犯罪团伙:1、8和11。
#include<cstdio>
int a[505],b[505],f[505];
int main()
{//freopen("gang.in","r",stdin);//freopen("gang.out","w",stdout);int m,n,i,j,x,y,sum=0,k;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){a[i]=i;b[i]=i;}for(i=1;i<=m;i++){scanf("%d%d",&x,&y);k=b[y];//注意b[y]的值会改变for(j=1;j<=n;j++){if(b[j]==k){b[j]=b[x];}}}for(i=1;i<=n;i++){f[b[i]]=1;}for(i=1;i<=n;i++){if(f[i]==1)sum++;}printf("%d",sum);
}
后来发现:a数组完全没有用,f数组也可以进行优化,
最终代码:
#include<cstdio>
int b[505];
int main()
{//freopen("gang.in","r",stdin);//freopen("gang.out","w",stdout);int m,n,i,j,x,y,sum=0,k;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){b[i]=i;}for(i=1;i<=m;i++){scanf("%d%d",&x,&y);k=b[y];for(j=1;j<=n;j++){if(b[j]==k){b[j]=b[x];}}}for(i=1;i<=n;i++){if(b[i]==i)sum++;}printf("%d",sum);
}
后来听别人说,这就是并查集算法。
并查集算法----犯罪团伙(黑科技)相关推荐
- Union-Find 并查集算法详解
Union-Find 并查集算法详解 文章目录 Union-Find 并查集算法详解 一.问题介绍 二.基本思路 三.平衡性优化 四.路径压缩 五.总结 六.例题 一.问题介绍 简单说,动态连通性其实 ...
- 简单易懂的并查集算法以及并查集实战演练
文章目录 前言 一.引例 二.结合引例写出并查集 1. 并查集维护一个数组 2. 并查集的 并 操作 3. 并查集的 查 操作 4. 基本并查集模板代码实现--第一版(有错误后面分析) 4.1 Jav ...
- C++并查集算法(详细)
C++并查集算法 什么是并查集? 并查集写法 详解 例题:洛谷 P3367.[模板]并查集 题意 代码 什么是并查集? 当我们在做图论题目的时候 经常会读到一些长这样的题目描述: -连接 a , b ...
- 并查集算法 | Union-Find Algorithm
Union-Find Algorithm即并查集算法,常用于解决 动态连通性,判断有向无圈图等问题. 根本上讲,Union-Find算法就和他的名字一样是一种对不相交集数据结构执行两个有用操作的算法, ...
- 给我三分钟,带你领略热血江湖中的并查集算法
你好,我是小黄,一名独角兽企业的Java开发工程师. 校招收获数十个offer,年薪均20W~40W. 感谢茫茫人海中我们能够相遇, 俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习 ...
- 并查集算法总结专题训练
并查集算法总结&专题训练 1.概述 2.模板 3.例题 1.入门题: 2.与别的算法结合: 3.考思维的题: 4.二维转一维: 5.扩展域并查集&边带权并查集: 4.总结 1.概述 并 ...
- 2021年SWPUACM暑假集训day2并查集算法
什么是并查集 并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 合并 及 查询 问题. 它支持两种操作: 1.查找(find):确定某个元素处于哪个子集 2.合并(merge):将两个子集 ...
- 人工智能3d建模算法_黑科技 | 3D人脸建模可以多简单?一张照片就搞定!
完成3D人脸建模,只需要一张肖像照,这种从平面世界直接穿越到3D空间的魔幻操作,就是知象光电团队带来的黑科技给你的surprise. 3D人脸建模技术--3DfacePro 知乎视频www.zhih ...
- java---并查集算法_食物链(每日一道算法2022.8.17)
难度警告!今天的题思路比较复杂,涉及数学知识congruence class 每天一道算法居然已经一个月了啊,期间居然没断更哈哈 呼呼~算法基础课过去三分之一了,啊后面好像越来越难了呜呜呜,还能保持日 ...
最新文章
- boost::python::type_info相关的测试程序
- LinkedBlockingQueue使用
- oracle数据库SQL防止超长,SQL Server和Oracle防止数据锁定的比较
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_38、源码编译安装Redis4.x...
- Springboot+vue项目旅游管理系统
- python公历转农历_Python 农历公历相互转换
- alios是安卓吗_阿里云OS到底是国产系统还是安卓系统?
- k3 修复服务器,金蝶K3数据修复服务工具包
- 信创操作系统--统信UOS桌面版(使用Systemd管理系统服务)
- 浅析MySQL死锁检测
- 股票每日复盘都应该做什么,需要从哪些方面复盘?
- wordpress手动安装插件WooCommerce
- mysql存储过程之循环语句(五)
- 计算机科学与技术高中选课,高中选课哪些组合最好
- NVT SDK 67X获取文件时长的一种方式
- 数据库系统原理与应用教程(077)—— MySQL 练习题:操作题 168-172(二十一):综合练习
- 定积分以及变积分上限函数(附代码)
- vue3的pinia详解
- RERAN:安卓系统的定时和点击的录制和回放——(2)
- 利用tushare 研究A股的动量效应