[BZOJ1370][Baltic2003]Gang团伙 并查集+拆点
2024-09-02 13:14:26
Description
在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1、 我朋友的朋友是我的朋友; 2、 我敌人的敌人是我的朋友; 所有是朋友的人组成一个团伙。告诉你关于这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?
Input
第1行为n和m,N小于1000,M小于5000; 以下m行,每行为p x y,p的值为0或1,p为0时,表示x和y是朋友,p为1时,表示x和y是敌人。
Output
一个整数,表示这n个人最多可能有几个团伙。
Sample Input
6
4
E 1 4
F 3 5
F 4 6
E 1 2
4
E 1 4
F 3 5
F 4 6
E 1 2
Sample Output
3
HINT
{1},{2,4,6},{3,5}
Solution
做法:并查集+拆点
朋友的朋友是我的朋友很好解决,直接并掉两个集合
关键是敌人的敌人就是我的朋友。
这个条件用拆点来解决
假设$x,y$敌对,将$x$和$y+n$这两个集合还有$y$,$x+n$这两个集合并起来就可以了
为什么要这样呢?
假设$a,b$为敌,$b,c$为敌,这样就可以把$a,c$并起来了
另外要注意细节,比如初始化$f[i]$要$for$到$2n$,跑完$m$个关系后要再重新跑一遍
#include <bits/stdc++.h> using namespace std ; #define N 5000 int n , m ;
int f[ N ] , a[ N ] ; int find( int x ) {
if( f[ x ] == x ) {
return x ;
}return f[ x ] = find( f[ x ] ) ;
} int main() {
scanf( "%d%d" , &n , &m ) ;
for( int i = ; i <= * n ; i ++ ) f[ i ] = i ;
for( int i = ; i <= m ; i ++ ) {
char ch[ ] ;
int x , y ;
scanf( "%s%d%d" , ch , &x , &y ) ;
if( ch[ ] == 'F' ) f[ find( y ) ] = find( x ) ;
else {
f[ find( y + n ) ] = find( x ) ;
f[ find( x + n ) ] = find( y ) ;
}
}
int ans = ;
for( int i = ; i <= n ; i ++ ) f[ i ] = find( i ) ;
sort( f + , f + n + ) ;
for( int i = ; i <= n ; i ++ ) {
if( f[ i ] != f[ i - ] ) ans ++ ;
}
printf( "%d\n" , ans ) ;
}
最新文章
- 基于CkEditor实现.net在线开发之路(2)编写C#代码,怎么调用它。
- 9. javacript高级程序设计-客户端检测
- 转:SDL2源代码分析
- PHP写入文件用file_put_contents代替fwrite优点多多(转)
- [Jobdu] 题目1517:链表中倒数第k个结点
- 为什么要学ADO.NET。。。什么是ADO.NET。。。
- (1-1)SpringCloud-Eureka:服务的注册与发现
- Git学习(一):初始化仓库、添加文件、版本回退
- 不支持iframe框架?出来吧pdf
- 微信小程序 app.json文件配置
- Spring 事务 readOnly 到底是怎么回事?
- 关于无限试用JetBrains产品的方案
- ANTLR flex/bison
- HTML5 图片宽高自适应,居中裁剪不失真
- alv界面透视功能
- Spark+IDEA单机版环境搭建+IDEA快捷键
- PHP写日志公共类
- 2017北京网络赛 Bounce GCD加找规律
- Yii2如何批量添加数据
- Python与R的争锋:大数据初学者该怎样选?
热门文章
- dedecms手机站图片错误的解决方法
- Mysql中Left Join 与Right Join 与 Inner Join 与 Full Join的区别
- Python3学习之路~2.6 集合操作
- Spark DataFrame vector 类型存储到Hive表
- Twitter OA prepare: Anagram is A Palindrome
- 强大的chrome(1)以acfun为例抓取视频
- Linux root用户下不能打开Google-chrome的解决办法
- Python: collections.nametuple()--映射名称到序列元素
- linux常用命令:iconv 命令
- quartz-job实现实时或定时发送短信任务