题目描述 Description

1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:

我朋友的朋友是我的朋友;

我敌人的敌人也是我的朋友。

两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。

输入描述 Input Description

输入文件gangs.in的第一行是一个整数N(2<=N<=1000),表示强盗的个数(从1编号到N)。 第二行M(1<=M<=5000),表示关于强盗的信息条数。 以下M行,每行可能是F p q或是E p q(1<=p q<=N),F表示p和q是朋友,E表示p和q是敌人。输入数据保证不会产生信息的矛盾。

输出描述 Output Description

输出文件gangs.out只有一行,表示最大可能的团伙数。

样例输入 Sample Input

6
4
E 1 4
F 3 5
F 4 6
E 1 2

样例输出
Sample Output

3

数据范围及提示
Data Size & Hint

2<=N<=1000

1<=M<=5000

1<=p q<=N

分类标签

Tags
点此展开

超时代码(递归时间太长了吧大概是因为):

(温馨贴士:递归能不用则不用)

 #include<iostream>
#include<cstdio>
#define Maxn 1005 using namespace std;//(F为朋友E为敌人) int f1,f2,n,m,tot=;
int F[Maxn],e[Maxn];
bool vis[Maxn]; int find(int x)
{
return x == F[x] ? x : F[x]=find(F[x]);
} void unionn(int x,int y)
{
f1=find(x);
f2=find(y);
if(f1!=f2)
{
F[f1]=f2;
if(e[f2]!=)//合并时,若r2有敌人
{
unionn(e[f2],f1);
if(e[f1]!=)//若r1也有敌人
{
unionn(e[f1],e[f2]);//则它们的敌人是朋友
}
else e[f1]=e[f2];//否则,r2的敌人同时也是r1的敌人,即他们为朋友
}
}
} int main()
{
char p;
int x,y;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)//初始化
{
F[i]=i;
e[i]=;
}
for(int i=;i<=m;i++)
{
cin>>p>>x>>y;
if(p=='F') //if x is y's friend
{
unionn(x,y); //并在一起
}
if(p=='E') //if x is y's 敌人(英语不会哈)
{
x=find(x);
if(e[x]==)//将y作为x团伙的敌人
{
e[x]=y;
}else unionn(e[x],y);
if(e[y]==)//与之类似
{
e[y]=x;
}else unionn(e[y],x);
}
}
for(int i=;i<=n;i++)
{
if(find(i)==i) tot++;//进行统计
}
printf("%d\n",tot);
return ;
}

AC代码:

其实就是把递归的地方改掉了而已,要好好的进行理解!!!

 #include<iostream>
#include<cstdio>
#define Maxn 2333 using namespace std;//(F为朋友E为敌人) int f1,f2,n,m,tot=;
int F[Maxn],e[Maxn]; int find(int x)
{
return x == F[x] ? x : F[x]=find(F[x]);
} int main()
{
char p;
int x,y;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)//初始化
{
F[i]=i;
}
for(int i=;i<=m;i++)
{
cin>>p>>x>>y;
if(p=='F') //if x is y's friend
{
f1=find(x);f2=find(y);
if(f1!=f2) F[f1]=f2; //并在一起
}
if(p=='E') //if x is y's 敌人(英语不会哈)
{
e[x] ? F[find(e[x])] = find(y) : e[x]=y;//x有敌人么?有就将y的集团与x敌人的集团并起来,没有就将y作为x的敌人
e[y] ? F[find(e[y])] = find(x) : e[y]=x;//同上
}
}
for(int i=;i<=n;i++)
{
if(find(i)==i) tot++;//进行统计
}
printf("%d\n",tot);
return ;
}

codevs 2597 团伙x的更多相关文章

  1. Codevs 2597 团伙(并查集)

    2597 团伙 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么 ...

  2. codevs 2597 团伙

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么 ...

  3. 团伙(codevs 2597)

    题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友 ...

  4. code vs 2597 团伙

    题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友 ...

  5. 食物链 2001年NOI全国竞赛

    时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond   题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B ...

  6. T2597 团伙 codevs

    http://codevs.cn/problem/2597/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 1920年的芝加 ...

  7. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  8. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  9. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

随机推荐

  1. Luogu P5068 [Ynoi2015]我回来了

    题目 Ynoi难得的水题. 首先我们可以\(O(n^2)\)地求出任意两点之间的距离. 然后我们可以\(O(n^3)\)地求出对于任意一个点\(u\),跟它距离\(\le d\)的点的集合. 然后对于 ...

  2. # 数字签名&数字证书

    目录 数字签名&数字证书 数字签名 数字证书 数字证书的实例(https协议) 数字签名&数字证书 参考资料: 数字签名是什么?-阮一峰的网络日志 数字签名和数字证书究竟是什么?知乎- ...

  3. 前端-CSS-初探-注释-语法结构-引入方式-选择器-选择器优先级-01(待完善)

    目录 CSS(Cascading Style Sheet) CSS注释 CSS语法结构 CSS的三种引入方式 选择器 伪类.伪元素选择器速查 CSS选择器优先级***** 选择器相同的情况下 选择器不 ...

  4. 如何实现一个简化版的 jQuery

    对于操作 DOM 来说,jQuery 是非常方便的一个库,虽然如今随着 React, Vue 之类框架的流行,jQuery 用得越来越少了,但是其中很多思想还是非常值得我们学习的,这篇文章将介绍如何从 ...

  5. java中代码块和构造方法以及普通方法的代码执行顺序总结

    说实话,这块真的不好理解啊~都怪jvm  执行顺序搞这么复杂,哼╭(╯^╰)╮ 但是  我们能怎么办,只能研究呗!!! !:首先,毫无置疑的,静态代码块在加载时就执行了,所以肯定是最先执行的.... ...

  6. O014、云计算与OpenStack

    参考https://www.cnblogs.com/CloudMan6/p/5334760.html   云计算 基本概念   所有的新事物都不是突然冒出来的,都有前世和今生.云计算也是IT技术不断发 ...

  7. 这十个MySQL经典错误

    今天就给大家列举 MySQL 数据库中,最经典的十大错误案例,并附有处理问题的解决思路和方法,希望能给刚入行,或数据库爱好者一些帮助,今后再遇到任何报错,我们都可以很淡定地去处理.学习任何一门技术的同 ...

  8. Visual Studio (VC) Win32 程序由于数据大,内存溢出怎么办?

    Visual Studio (VC) 内编写的Win32 程序由于数据大,内存溢出,即使转移到64位系统也不行.在国外网站上找到了答案. 原来,只需在project->property中的Lin ...

  9. (持续更新中~~~)kafka--消息引擎与分布式流处理平台

    kafka概述 kafka是一个分布式的基于发布/订阅模式的消息队列(message queue),一般更愿意称kafka是一款开源的消息引擎系统,只不过消息队列会耳熟一些.kafka主要应用于大数据 ...

  10. cmd中subst的使用

    SUBST [drive1: [drive2:]path] drive1:        指定要指派路径的虚拟驱动器.[drive2:]path  指定物理驱动器和要指派给虚拟驱动器的路径. 路径替换 ...