【9009】团伙

2023-11-20 14:50
文章标签 团伙 9009

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

Time Limit: 1 second
Memory Limit: 128 MB

【问题描述】

在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1.我朋友的朋友是我的朋友; 2.我敌人的敌人是我的朋友 所有是朋友的人组成一个团伙。告诉你冠以这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,就计算出这个城市最多可能有多少个团伙? 

【输入格式】

第1行为n和m,(1< n < 1000),(1<=m<=100000) 以下m行,每行为p x y,p的值为0或1,p为0时,表示x和y是朋友,p为1时,表示x和y是敌人。

【输出格式】

一个整数,表示这n个人最多可能有几个团伙

Sample Input

6 4
1 1 4
0 3 5
0 4 6
1 1 2

Sample Output

3

【题解】(两类方法)

法一:

给并查集数组多开n个位置。

这时f[x+n]表示x的直系敌人的朋友所在的集合。


这样找可以根据所有人的直系敌人,找到所有人的敌人的敌人,也就是所有人的间接朋友。

在输入 1 x y 时执行这两句

hebing(x+n,y)与hebing(x,y+n);

假如x没有任何直系敌人。

则y就与x+n两个元素构成一个集合。

如果又有z与x是敌人关系,则z,y,x+n构成一个集合。

最后判断团伙的时候不管n以上的东西。只看n一下的f数组即可。即x+n只起到一个串联作用。桥梁。嗯这样解释可以吗。

【代码1】

#include <cstdio>int n,m,f[2010],ans = 0;int findfather(int t) //并查集的找根函数和路径压缩 
{if (f[t] != t)f[t] = findfather(f[t]);return f[t];
}void hebing(int x,int y) //把x元素和y元素合并到同一个集合当中。 
{int r1 = findfather(x),r2 = findfather(y);if (r1!=r2)f[r2] = r1;	
}void input_data()
{scanf("%d%d",&n,&m);for (int i = 1;i <= 2*n;i++) //n以上是i-n的敌人的朋友所在集合的标志元素(桥梁) f[i] = i;for (int i = 1;i <= m;i++){int p,x,y;scanf("%d%d%d",&p,&x,&y);if (p == 0) //如果是朋友就直接合并 hebing(x,y);else //否则,就把各自加入到对方的敌人的朋友的行列中。 {hebing(x,y+n);hebing(x+n,y);	}}		
}void get_ans()
{bool bo[2010];for (int i = 1;i <= n;i++) //要再进行一次路径压缩。保证每个集合的元素都指向根节点。 findfather(i);for (int i = 1;i <= 2*n;i++) //这是用于判断有几个团伙 bo[i] = false;for (int i = 1;i <= n;i++) //根据bo数组来确定有几个团伙。 if (bo[f[i]] == false){bo[f[i]] = true;ans++;}printf("%d\n",ans);
}int main()
{//freopen("F:\\rush.txt","r",stdin);input_data();get_ans();return 0;	
}
法二:

先把敌人的信息以图的形式存储。无向图。

朋友还是直接合并。

最后用for循环来寻找i的两个直系敌人,然后把它们合并在一起。这里f数组只要开到n.思路与上面的程序是相同的。但是更直观一点。

【代码2】

#include <cstdio>
#include <cstring>
#include <cstring>
#define maxren 1005int n,m,pengyou[maxren],enemy[maxren][maxren]; //pengyou相当于f数组,enemy是将敌人关系用图的形式记录下来int findfather(int x) //寻根 + 路径压缩。 
{if (pengyou[x] != x)pengyou[x] = findfather(pengyou[x]);return pengyou[x];	
}void hebing(int x,int y) //把x元素和y元素合并起来 
{int r1 = findfather(x),r2 = findfather(y);	if (r1!=r2)pengyou[r2] = r1;
}void input_data()
{memset(enemy,0,sizeof(enemy));scanf("%d%d",&n,&m);	for (int i = 1;i <= n;i++)pengyou[i] = i;for (int i = 1;i <= m;i++){int p,x,y;scanf("%d%d%d",&p,&x,&y);if (p == 0)hebing(x,y);	else //如果是敌人就建立一条无向边。 {enemy[x][0]++;enemy[x][enemy[x][0]] = y;enemy[y][0]++;enemy[y][enemy[y][0]] = x;}}
}void get_ans()
{for (int i = 1;i <= n;i++) //用3层for循环来找i的直系敌人。找到两个然后他们就是朋友了。 for (int j = 1;j <= enemy[i][0]-1;j++)for (int k = j+1;k <= enemy[i][0];k++){int r1 = findfather(enemy[i][j]);int r2 = findfather(enemy[i][k]);if (r1!=r2)pengyou[r2] = r1;}}void output_ans() //最后用判重的方法找到团伙数 (也可以用排序的方法,相同元素会聚在一起) 
{bool bo[1010];memset(bo,false,sizeof(bo));int num = 0;for (int i = 1;i <= n;i++)findfather(i);for (int i = 1;i <= n;i++)if (!bo[pengyou[i]]){bo[pengyou[i]] = true;num++;	}printf("%d\n",num);}int main()
{//freopen("F:\\rush.txt","r",stdin);input_data();get_ans();output_ans();return 0;	
}


这篇关于【9009】团伙的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

黑客团伙利用Python、Golang和Rust恶意软件袭击印国防部门;OpenAI揭秘,AI模型如何被用于全球虚假信息传播? | 安全周报0531

巴黑客团伙利用Python、Golang和Rust恶意软件袭击印度国防部门! 与巴基斯坦有联系的Transparent Tribe组织已被确认与一系列新的攻击有关,这些攻击使用Python、Golang和Rust编写的跨平台恶意软件,针对印度政府、国防和航空航天部门。 “这一系列活动从2023年底持续到2024年4月,并预计将持续下去.”黑莓研究和情报团队在上周初发布的一份技术报告中说。

开发多个工具包的黑产团伙GXC正在积极拥抱AI技术

研究人员发现一个名为 GXC Team 的犯罪团伙,该团伙专门开发用于网上银行盗窃、电子商务欺诈与互联网诈骗的工具。2023 年 11 月 11 日,该组织以别名 googleXcoder 在暗网上发布多项公告。开始售卖新开发的结合人工智能的工具,用于创建用于电汇欺诈和商业电子邮件泄露(BEC)诈骗的欺诈性发票。 根据 FBI 的报告,2022 年平均每次 BEC 诈骗会造成超过 12 万美

###spark版### Spark Graphx 进行团伙的识别(community detection)

最近在使用Spark Graphx,拿Graphx做了点实验。对大规模图常见的分析方法有连通图挖掘,团伙挖掘等。在金融科技领域,尤其风控领域,会有各种重要的关联网络,并且这种网络图十分庞大。 所以,Spark Graphx这种分布式计算框架十分适合这种场景。下面以设备间关联网络(节点数亿级别)为例,采用Graphx做一个设备团伙挖掘demo。团伙识别的算法采用的是Graphx自带的LabelP

浙江浦江警方打掉一贷款诈骗团伙 22人被刑拘

诈骗团伙以网络贷款的名义进行诈骗。警方提供 诈骗团伙以网络贷款的名义进行诈骗。警方提供 中新网金华1月19日电(记者 奚金燕 通讯员 潘再阳 )无需抵押,只需要资质包装费和账号激活费,巨额贷款就能轻易到手,这样的“好事”没成想却是个骗局。19日记者获悉,浙江浦江公安日前成功粉碎了一个盘踞深圳、武汉两地,以办理信用卡贷款为由进行犯罪的诈骗团伙,一举捣毁两个诈骗窝点。据悉,该案受害者多达600

国庆期间遇到两个诈骗团伙

国庆期间, 出去了一下, 别的不说, 就说说我遇到的诈骗团伙吧, 希望朋友们以后都警惕。        一.  银川某超市, 我买了40元的东西, 付款后被告知, 可以有两次抽奖机会。 我想, 这么大的超市, 免费抽奖, 那就抽呗。 第一张是谢谢惠顾, 第二张是价值500元的购物券, 但有限制。  当时, 我确实小小高兴了一下, 而且那两个小MM告诉我, 我抽中的奖的概率是千分之八

碰瓷碰出新高度?团伙作案有预谋,一言不合就碰你,还有这种操作?

近来发现最近的碰瓷团伙愈演愈烈,早有预谋,就等着你这只肥羊上钩   出门在外,叫上三五好友一起吃饭喝酒,聊聊人生,总是不可少的,当吃饱喝足,醉意朦胧之时,看着自己的爱车,再想想酒后驾驶的坏处,准备掏出手机呼叫一波当前热门的代驾司机,送自己回家的时候,突然有人冲出来,说“自己是代驾的,价格实惠,安全到家”。想必,在醉醺醺的时候也不会多想,便接受了小哥的服务,让他送自己回家。   就在离家小区很近的

Akira勒索软件团伙及其策略的全面解析

Sophos MDR威胁情报团队曾于2023年5月发表过一篇博文,称Akira勒索软件“将1988年的时光带回”。起因是Akira会将受害者网站篡改为具有复古美学的页面,让人想起20世纪80年代的绿色屏幕控制台。而且,Akira的名字也可能取自1988年流行的同名动画电影《阿基拉》(Akira)。 事实上,自Akira勒索软件组织于2023年3月发起首次攻击以来,便迅速成为中小型企业面临的强大勒

美国政府悬赏1000万美元,获取 DarkSide 勒索团伙线索

聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 上周四,美国政府公开征求DarkSide 勒索团伙的信息线索,任何人,如能提供使政府找到或定位到该团伙关键领导人物的信息,则可获得1000万美元的悬赏。 美国国务院还表示,除以上悬赏外,任何人提供的情报和举报信息能使政府逮捕和/或定罪策划或试图参与和有组织的跨国犯罪集团相关的入侵活动的任何国家的个体,则可获得最高500万美元的悬赏。 美国国

2018年陕西查办恶势力犯罪集团及团伙案件517件

西安市公安局举行“决战决胜2019扫黑除恶誓师大会”。(资料图) 阿琳娜 摄 西安市公安局举行“决战决胜2019扫黑除恶誓师大会”。(资料图) 阿琳娜 摄 中新网西安1月18日电 (记者 阿琳娜)记者从18日陕西省委宣传部举办的新闻发布会上获悉,2018年该省共立案侦查黑社会组织犯罪37件;查办恶势力犯罪集团及团伙案件517件;破获刑事案件5925起,抓获涉黑涉恶犯罪嫌疑人9260人。

Codevs 2597 团伙(并查集)

2597 团伙 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是: 我朋友的朋友是我的朋友; 我敌人的敌人也是我的朋友。 两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的