一言不合先贴题目

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

Sample Output

3

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团伙题解的更多相关文章

  1. 续并查集学习笔记——Closing the farm题解

    在很多时候,并查集并不是一个完整的解题方法,而是一种思路. 通过以下题目来体会并查集逆向运用的思想. Description Farmer John and his cows are planning ...

  2. 边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解

    花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息.然而我们有时会发现并查集所维护的信息不够用,这时"边带权并查集"就 ...

  3. 【并查集】BZOJ1370- [Baltic2003]Gang团伙

    [题目大意] 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一个团伙.告诉你关于这n个人的m条信 ...

  4. Javascript学习笔记:闭包题解(4)

    代码: var val1=0; var val2=0; var val3=0; for(var i1=1;i1<=3;i1++){ var i2=i1; (function(){ var i3= ...

  5. Javascript学习笔记:闭包题解(3)

    代码: function assignHandler(){ var element=document.getElementById('someElementId'); element.onclick= ...

  6. Javascript学习笔记:闭包题解(2)

    代码: var name='The Window'; var object={ name:'My Object', getNameFunc:function(){ return function(){ ...

  7. Javascript学习笔记:闭包题解(1)

    代码: function createFunctions(){ var result=[]; for(var i=0;i<10;i++){ result[i]=function(){ retur ...

  8. 并查集 (Union-Find Sets)及其应用

    定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的 ...

  9. 九度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 ...

随机推荐

  1. dsview

    http://blog.csdn.net/gzshun/article/details/7495488 http://blog.csdn.net/hjl_1991/article/details/50 ...

  2. 基于Python的TestAgent实现

    问题: 1.本人工作主要做自动化,经常要去Linux后台进行一些脚本操作,有时要去后台执行命令,如果逐个登陆比较费事,效率会大打折扣 2.虽然有可以直接去后台执行命令的AW,但是该AW存在很多问题,而 ...

  3. Python开发【前端】:汇总

    页面模板 1.EasyUI(推荐指数★) JQuery EasyUI中文网 下载 使用方法:把文件下载到本地.直接从官网上把源码拷贝过来,更改下js的路径即可 优点:功能非常多.非常齐全 偏做后台管理 ...

  4. Redis入门指南(第2版) Redis设计思路学习与总结

    https://www.qcloud.com/community/article/222 宋增宽,腾讯工程师,16年毕业加入腾讯,从事海量服务后台设计与研发工作,现在负责QQ群后台等项目,喜欢研究技术 ...

  5. onload事件-----addLoadEvent函数

    在给网页加一些特效时经常要在<body>中加入“onload”事件,即在网页加载完后执行某事件,例如:<body onload=”alert(‘欢迎光临!')”,但这样做有个大的缺陷 ...

  6. Windows Server 2008 任务计划无法自动运行的解决办法

    问题:编写的bat脚本,直接执行,成功:但是在任务管理器中配置该任务,运行不成功,结果显示为:0x1,系统环境为 Windows Server 2008. 分析:bat任务没有调用执行. 解决方案: ...

  7. Python爬虫爬取百度贴吧的图片

    根据输入的贴吧地址,爬取想要该贴吧的图片,保存到本地文件夹,仅供参考: #!/usr/bin/python#_*_coding:utf-8_*_import urllibimport urllib2i ...

  8. js 控制浏览器窗口大小

    //打开一个新窗口并设置其大小window.open('index.html','','width=450,height=750,location=no,menubar=no,status=no,to ...

  9. NLog配置文件根节点

    NLog.config 配置文件信息 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi ...

  10. 夺命雷公狗----Git---5---分支

    git分支的概念相当于是添加一个属于自己的分支,别人是看不到的,等你写完自己的程序到时候在合并到团队的分支上即可.... 我们可以查看自己git里面有什么分支,如下所示: git branch 在这里 ...