续并查集学习笔记——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 ...
随机推荐
- phyton 相关学习
http://www.nowamagic.net/academy/category/13/ http://www.runoob.com/python/python-reg-expressions.ht ...
- JMeter学习(三十四)测试报告优化
如果按JMeter默认设置,生成报告如下: 从上图可以看出,结果信息比较简单,对于运行成功的case,还可以将就用着.但对于跑失败的case,就只有一行assert错误信息.(信息量太少了,比较难找到 ...
- windows下mysqlbinlog二进制恢复
Mysql数据恢复主要针对Windows游戏引擎服务器意外宕机,以及游戏出现重大BUG,导致需要回档. 注意:请在恢复数据库之前,备份目标数据库,切记! 一.Windows服务器意外DOWN机,数据库 ...
- [CC]平面拟合
常见的平面拟合方法一般是最小二乘法.当误差服从正态分布时,最小二乘方法的拟合效果还是很好的,可以转化成PCA问题. 当观测值的误差大于2倍中误差时,认为误差较大.采用最小二乘拟合时精度降低,不够稳健. ...
- CentOS 7 安装字体库 & 中文字体
前言 报表中发现有中文乱码和中文字体不整齐(重叠)的情况,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效: 如上图可以看出,不仅没有中文字体,连字体 ...
- jq弹框确认
function delCustomer(id,num){ var r=confirm("友情提醒:确认要删除客户吗?"); if (r==true){ $.ajax({ type ...
- C#针对js escape解码
在javascript 中通常用escape与unescape进行编码以方便传输. 在asp.net页面接收到这些数据以后可以使用 Microsoft.JScript.GlobalObject.une ...
- SLP的模块结构
SLP的模块结构 在开发初期,拟将SLP分为5个模块: 基础练习模块 特定歌曲难点练习模块 玩家能力测试模块 全局设置模块 玩家信息模块 基础练习模块 这里提供可控类型.可控长度.可控BPM的练习套餐 ...
- cmd光标移动
ESC:清除当前命令行.F1: 单字符输出上次输入的命令 相当于方向键上的 → 的作用.F2: 可复制字符数量 , 输入上次命令中含有的字符,系统自动删除此字符后的内容.F3: 重新输入前一次输入的命 ...
- jQuery Scroll Follow
Overview Scroll Follow is a simple jQuery plugin that enables a DOM object to follow the page as the ...