续并查集学习笔记——Gang团伙题解
一言不合先贴题目
Description
Input
Output
Sample Input
4
E 1 4
F 3 5
F 4 6
E 1 2
Sample Output
HINT
{1},{2,4,6},{3,5}
一开始的想法和ABC野兽那道题一样,可以维护每个点和祖先的关系。而且似乎更简单。于是有了下面的程序
#include<iostream>
#include<cstdio>
using namespace std;
int fa[],deep[],ans[][],n,m;
int getf(int k){
if(fa[k]!=k){
int t=fa[k];
fa[k]=getf(fa[k]);
deep[k]=deep[k]+deep[t];
deep[k]=deep[k]%;
}
return fa[k];
}
int main(){
cin>>n>>m;
for(int i=;i<=n;++i){
fa[i]=i;
deep[i]=;
}
for(int i=;i<=m;++i){
char c[];
int x,y;
scanf("%s%d%d",&c,&x,&y);
if((c[]=='')&&(getf(x)!=getf(y))){
int fx=getf(x);
int fy=getf(y);
deep[fx]=(deep[y]-deep[x]+)%;
fa[fx]=fy;
}
if((c[]=='')&&(getf(x)!=getf(y))){
int fx=getf(x);
int fy=getf(y);
deep[fx]=(deep[y]-deep[x]+)%;
fa[fx]=fy;
}
} for(int i=;i<=n;++i){
fa[i]=getf(i);
//cout<<fa[i]<<" "<<deep[i]<<endl;
ans[fa[i]][deep[i]]++;
}
int add=;
for(int i=;i<=n;++i)
for(int j=;j<=;++j)if(ans[i][j]>){
add++;
} cout<<add;
return ;
}
然后、、、、、、就爆0了。
哪里出了问题?忽然发现题设中并没有:我的敌人的朋友是我的敌人。MDZZ!这不符合逻辑啊,虽然NOI从来不讲逻辑。
重新出发,想到分点的方法。通过朋友相关联的,fa[x]=y;通过敌人相关联的,fa[x]=y+n,fa[x+n]=y。该题完美解决。楼下程序:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,ans,a[];
int fa[];
int Find(int x) {
if(!fa[x]||fa[x]==x)
return fa[x]=x;
return fa[x]=Find(fa[x]);
}
void Union(int x,int y) {
x=Find(x);y=Find(y);
if(x==y) return ;
fa[x]=y;
}
int main(){
int i,x,y;
char p[];
cin>>n>>m;
for(i=;i<=m;i++)
{
scanf("%s%d%d",p,&x,&y);
if(p[]=='F')
Union(x,y);
else
Union(x,y+n),Union(x+n,y);
}
for(i=;i<=n;i++)
a[i]=Find(i);
sort(a+,a+n+);
for(i=;i<=n;i++)
if(i==||a[i]!=a[i-])
++ans;
cout<<ans<<endl;
return ;
}
To be continue......
续并查集学习笔记——Gang团伙题解的更多相关文章
- 续并查集学习笔记——Closing the farm题解
在很多时候,并查集并不是一个完整的解题方法,而是一种思路. 通过以下题目来体会并查集逆向运用的思想. Description Farmer John and his cows are planning ...
- 边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解
花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息.然而我们有时会发现并查集所维护的信息不够用,这时"边带权并查集"就 ...
- 【并查集】BZOJ1370- [Baltic2003]Gang团伙
[题目大意] 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一个团伙.告诉你关于这n个人的m条信 ...
- Javascript学习笔记:闭包题解(4)
代码: var val1=0; var val2=0; var val3=0; for(var i1=1;i1<=3;i1++){ var i2=i1; (function(){ var i3= ...
- Javascript学习笔记:闭包题解(3)
代码: function assignHandler(){ var element=document.getElementById('someElementId'); element.onclick= ...
- Javascript学习笔记:闭包题解(2)
代码: var name='The Window'; var object={ name:'My Object', getNameFunc:function(){ return function(){ ...
- Javascript学习笔记:闭包题解(1)
代码: function createFunctions(){ var result=[]; for(var i=0;i<10;i++){ result[i]=function(){ retur ...
- 并查集 (Union-Find Sets)及其应用
定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的 ...
- 九度OJ 1446 Head of a Gang -- 并查集
题目地址:http://ac.jobdu.com/problem.php?pid=1446 题目描述: One way that the police finds the head of a gang ...
随机推荐
- ps用画笔工具设计水墨圆环
1.打开ps,新建一个1500*1500px的空白文档,分辨率为72,背景选择白色,如图: 2.选择画笔工具,按F5调出画笔预设面板,设置参数. 画笔笔尖形状:选择27号画笔,找不到可以复位一下画笔: ...
- imx6 usb otg config 配置
imx6 usb的host和slave配置,配置之后,安装gadget模块,就能够在host和slave之间切换. 参考文档: i.MX 6Dual/6Quad Linux Reference Man ...
- 随手记一次用C#正则表达式获取下拉菜单html标签<select>以及相关属性值
随手记一次用C#正则表达式获取下拉菜单html标签<select>以及相关属性值 1:有如下html: .................. <select id="aaa ...
- http的一些事
查找资料将http中缓存相关的知识记录下 一般来说:Last-Modifed和Expires是一对,ETag和Cache-Control是一对 Last-Modified Client端跟Server ...
- WIN8,开机启动 需要管理员权限的程序
1. 用WPF开发,需要管理员权限并开机启动,以写注册表的方式实现.仅写注册表只能启动一般权限的程序. 2. 考虑这样实现: 程序以一般权限启动,启动以后申请管理员权限. 实现: App类中重写OnS ...
- c语言简易版文法
文法 <程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→ ...
- LDAP的Schema
Schema是LDAP的一个重要组成部分,类似于数据库的模式定义,LDAP的Schema定义了LDAP目录所应遵循的结构和规则,比如一个 objectclass会有哪些属性,这些属性又是什么结构等等, ...
- iOS设置cell选中时文字颜色的变化
cell.titleStr.highlightedTextColor = EMCGreenColor;
- iptables 设置肯限制流量
1.查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source ...
- python学习笔记系列----(三)数据结构
这一章主要是介绍了python一些常用的数据结构,比如list,tuple,dictionary,set,以及一些实用遍历技巧,主要讲的还是list. 3.1 list 主要介绍了list的一些常用的 ...