1385:团伙(group)

2023-12-25 06:50
文章标签 group 团伙 1385

本文主要是介绍1385:团伙(group),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

1385:团伙(group)
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:

1、我朋友的朋友是我的朋友;

2、我敌人的敌人是我的朋友;

所有是朋友的人组成一个团伙。告诉你关于这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?

【输入】
第1行为n和m,1<n<1000,1<=m<=100 000;

以下m行,每行为p x y,p的值为0或1,p为0时,表示x和y是朋友,p为1时,表示x和y是敌人。

【输出】
一个整数,表示这n个人最多可能有几个团伙。

【输入样例】
6 4
1 1 4
0 3 5
0 4 6
1 1 2
【输出样例】
3


题目分析:第一条规定很容易实现,使用基本的并查集操作即可;第二条规定可以把每个人所有的敌人使用集合存储起来,操作和第一条就一样了。
具体方法是,为每个人建立一个结构体,包含两个成员,一个是自己的直接首领的编号(dboss),一个是自己所有的敌人(enemies)。然后建立一个函数boss查找一个人所属团伙的最高首领。所有boss相同的人组成一个团伙。这样,当两个人是朋友时,就合并两个人所在的团伙,即将其中一个人的boss的dboss设为另一个人(的boss);当两个人是敌人时,两个人分别与对方的敌人执行上述操作。最后,boss的数目就是所求数目。


C++代码

#include<iostream>
#include<unordered_set>
using namespace std;
struct person
{short dboss;//该人的直接首领unordered_set<short> enemies;//该人的敌人
}ps[1005];
short boss(short a)//查找一个人所属团伙的最高首领
{if (ps[a].dboss != a)return boss(ps[a].dboss);return a;
}
void group_merge(short x, short y)//把x和y两个团伙合并
{ps[boss(x)].dboss = boss(y);
}
int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; ++i)//初始化ps[i].dboss = i;while (m--){bool p;short x, y;cin >> p >> x >> y;if (p)//我敌人的敌人是我的朋友{for (short i : ps[y].enemies){if (i != x)group_merge(x, i);}for (short i : ps[x].enemies){if (i != y)group_merge(y, i);}ps[x].enemies.insert(y);ps[y].enemies.insert(x);}else//我朋友的朋友是我的朋友group_merge(x, y);}short result = 0;//直接查不相同的最高首领有多少个bool b[1005]{};for (short i = 1; i <= n; i++){const short bs = boss(i);if (!b[bs]){++result;b[bs] = true;}}cout << result;return 0;
}

运行结果

运行结果

这篇关于1385:团伙(group)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/534588

相关文章

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

AI辅助编程里的 Atom Group 的概念和使用

背景 在我们实际的开发当中,一个需求往往会涉及到多个文件修改,而需求也往往有相似性。 举个例子,我经常需要在 auto-coder中需要添加命令行参数,通常是这样的: /coding 添加一个新的命令行参数 --chat_model 默认值为空 实际上这个需求涉及到以下文件列表: /Users/allwefantasy/projects/auto-coder/src/autocoder/auto

group by 新体会

group by 分组语句中的 select 后面查询的东西,只能是 group by 中的字段或聚合函数,如果含有group by 中的没有的字段,sql 会报错。 表users   例子:  1.select count(1),sex from users group by sex; sql执行正确   2.select count(id),sex from users gr

JD 1385:重建二叉树

OJ题目:click here~~ 题目分析:给前序遍历序列和中序遍历序列,重构二叉树并输出后序遍历序列 剑指offer 面试题6 AC_CODE int pre[1008] , in[1008] ;struct Node{int x ;Node *left ;Node *right ;};bool buildsubtree(Node*& root , int* spre , in

【Mysql】系统服务启动访问报错问题处理:this is incompatible with sql_mode=only_full_group_by

一、背景: 本来已经正常运行的平台,突然有一天由于对服务器进行部分操作迁移,发现jar可以正常启动,但是访问功能一直报错,监控后台日志后,发现了问题: 报错的具体信息如下: Caused by: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and conta

group by和order by

order by  是按字段排序       (排序查询asc升序desc降序) group by  是按字段分类    (分组查询having只能用于group by子句,作用于组内,having条件子句可以直接跟函数表达式)       order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。

docker 启动 wurstmeister/zookeeper出错:be owned by root and not group or world-writable docker zookeep

总有一些意想不到的问题,别的环境都好好的,这个环境就是不行,启动脚本 docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper 发现 zookeeper启动后直接退出。查看日志 >> docker logs zookeeper>> /var/run/sshd must be owned by root and

SQL 支持使用 GROUP BY多个列

SQL 语言支持使用 GROUP BY 子句对多个列进行分组。当你对多个列进行分组时,SQL 会根据这些列的组合值来分组数据。这意味着只有当所有指定的列在多行中具有相同的值时,这些行才会被分组在一起。 语法 SELECT column1, column2, AGGREGATE_FUNCTION(column3) FROM table_name GROUP BY column1, column2

谈谈分组:sql的group by+聚集函数 和 python的groupby+agg

直接举例子+分析例子+总结来说,我先给几个表: 学生表:student(学号,姓名,年龄,院系); 课程表:course(课程号,课程名,学分); 学生选课表:sc(学号,课程号,分数); 啥时候用分组呢? 我由简至深来谈。 1、比如让我们查询各个课程号及相应的选课人数。 首先定位到sc表上,“各个”很明显就是要按课程分组,group by出场了,分组后对每组去统计选课人数,聚集函数出场了。

OceanBase 关于 place_group_by HINT的使用

PLACE_GROUP_BY Hint 表示在多表关联时,如果满足单表查询后直接进行group by 的情形下,在跟其它表进行关联统计,减少表内部联接。 NO_PLACE_GROUP_BY Hint 表示在多表关联时,在关联后才对结果进行group by。 使用place_group_by 的耗时少于no_place_group_by的耗时,原因可以查看执行计划的COST区别。 直接上图 #不