一言不合先贴题目

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. asp.net mvc中ViewData、ViewBag和TempData的详解

    一.ViewData和ViewBag 1.ViewData和ViewBag都是从Action向View传递数据的方式,当然还有其他方式如向View传递Model. 2.ViewData页面查询数据时需 ...

  2. 鼠绘漫画 for wp8.1

    技术规格总结: 这个APP 总体上是下载图片的一个APP 所以对图片的查看&控制上需要一定功力,至少有一个稳定的缩小,放大的图片控件. 搭载WP系统的手机,内存上大部分不是很大,所以内存的控制 ...

  3. IE or Chrome can not use localhost, firefox can works.

    因为服务器开启'localhost:9999",使用IE无法登陆,firefox下正常. 遂查看cookie,果然没有写入. stackoverflow.com: "ie enab ...

  4. C语言数据类型取值范围

    一.获取数据类型在系统中的位数 在不同的系统中,数据类型的字节数(bytes)不同,位数(bits)也有所不同,那么对应的取值范围也就有了很大的不同,那我们怎么知道你当前的系统中C语言的某个数据类型的 ...

  5. 邓博泽 java最全的DateUtil工具类

    package com.kld.yijie.web.util; import org.slf4j.Logger;import org.slf4j.LoggerFactory; import java. ...

  6. Java Thread 多线程 介绍

    1.线程概述 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程. 当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程. 2.线程 ...

  7. Python多重装饰器

    多重装饰器,即多个装饰器修饰同一个对象[实际上并非完全如此,且看下文详解] 1.装饰器无参数: >>> def first(func): print '%s() was post t ...

  8. Ubuntu常用软件安装

    1.好用的截图Shutter,sudo apt-get install shutter

  9. link和@import的区别、及各自的应用

    面试的过程中遇到的问题,当时自己回答的感觉自己心里还是很满意的,但是回来百度查看后才知道自己回答的有多么的糟糕: 下面我这这个知识点做一些总结的书面说明,为了少走点弯路,多涨点见识吧. 首先我们要了解 ...

  10. 【转】安装mysql 出现:Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist

    来源:http://blog.csdn.net/dapeng0112/article/details/37053407 本来初始化配置是这样的: scripts/mysql_install_db -- ...