codevs 2597 团伙x
1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:
我朋友的朋友是我的朋友;
我敌人的敌人也是我的朋友。
两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。
输入文件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是敌人。输入数据保证不会产生信息的矛盾。
输出文件gangs.out只有一行,表示最大可能的团伙数。
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的更多相关文章
- Codevs 2597 团伙(并查集)
2597 团伙 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么 ...
- codevs 2597 团伙
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么 ...
- 团伙(codevs 2597)
题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友 ...
- code vs 2597 团伙
题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友 ...
- 食物链 2001年NOI全国竞赛
时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B ...
- T2597 团伙 codevs
http://codevs.cn/problem/2597/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 1920年的芝加 ...
- codevs 3289 花匠
题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
随机推荐
- 【转帖】超能课堂(188) WiFi 6凭什么可以如此“六”?
https://www.expreview.com/69155.html 不明觉厉 这些东西 自己理解的还是少呢 电脑硬件可能一年甚至不到一年就会开始更新换代,但是路由器就不一样,它们的更新换代往往是 ...
- 蚂蚁分类信息商家发布文章、商品外链及远程图片自动添加nofollow属性
蚂蚁商户发布文章.商品是可以添加外链或者直接用外部图片,但是这对分类网站运营不利. 所以要对外链进行过滤,演示网站保洁,蚂蚁分类的源码. 下面就说下怎么处理自动给外链自动加上nofollow属性. 1 ...
- 测试必知150个常用Linux命令,已为各位筛选整理
●线上查询及帮助命令(1 个) help 如:mkdir --help ●文件和目录操作命令(12 个) ls tree pwd mkdir rmdir cd touch cp mv r ...
- Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系)
Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系) 在面向对象的中,类与类之间存在三种关系:依赖关系.组合关系.继承关系. 1.依赖关系:将一个类的类名或对象当做参数传递给另一个函数被 ...
- 使用Keras基于RCNN类模型的卫星/遥感地图图像语义分割
遥感数据集 1. UC Merced Land-Use Data Set 图像像素大小为256*256,总包含21类场景图像,每一类有100张,共2100张. http://weegee.vision ...
- bash 转换为C代码
bash 转换为C代码,并编译为可执行文件 [root@localhost ~]# wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9. ...
- 前端 使用localStorage 和 Cookie相结合的方式跨页面传递参数
A页面 html代码: 姓名:<input type="text" id="name1"> 年龄:<input type="text ...
- Java continue 、break、标签
任何迭代语句的主体部分都可以用break和continue控制循环流程,其中break用于强行退出循环,不执行循环中剩余的语句, 而continue则停止当前的迭代,然后退回循环起始处,开始下一次迭代 ...
- 06 Python网络爬虫requets模块高级用法
一. 基于requests模块的cookie操作 - cookie概念: 当用户通过浏览器访问一个域名的时候,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就 ...
- 使用iview 的表单组件验证 Upload 组件
使用iview 的表单组件验证 Upload 组件 结果: 点击提交按钮, 没有填的form 项, 提示错误, 当填入数据后提示验证成功 代码: <template> <div id ...