pat a1034 团伙头目【图的深搜】

复现基于PYNQ-Z2的手写数字识别卷积加速器设计 来源雪天鱼。 阅读详情

 题目:

https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624

一、问题描述

One way that the police finds the head of a gang is to check people's phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be the total time length of all the phone calls made between the two persons. A "Gang" is a cluster of more than 2 persons who are related to each other with total relation weight being greater than a given threshold K. In each gang, the one with maximum total weight is the head. Now given a list of phone calls, you are supposed to find the gangs and the heads.

Input Specification:

Each input file contains one test case. For each case, the first line contains two positive numbers N and K (both less than or equal to 1000), the number of phone calls and the weight threthold, respectively. Then N lines follow, each in the following format:

Name1 Name2 Time

where Name1 and Name2 are the names of people at the two ends of the call, and Time is the length of the call. A name is a string of three capital letters chosen from A-Z. A time length is a positive integer which is no more than 1000 minutes.

Output Specification:

For each test case, first print in a line the total number of gangs. Then for each gang, print in a line the name of the head and the total number of the members. It is guaranteed that the head is unique for each gang. The output must be sorted according to the alphabetical order of the names of the heads.

Sample Input 1:

8 59
AAA BBB 10
BBB AAA 20
AAA CCC 40
DDD EEE 5
EEE DDD 70
FFF GGG 30
GGG HHH 20
HHH FFF 10

Sample Output 1:

2
AAA 3
GGG 3

Sample Input 2:

8 70
AAA BBB 10
BBB AAA 20
AAA CCC 40
DDD EEE 5
EEE DDD 70
FFF GGG 30
GGG HHH 20
HHH FFF 10

Sample Output 2:

0

给出若干人之间的通话长度(视为无向边),这些通话将他们分为若干组。每个组的总边权设为该组内的所有通话的长度之和,而每个人的点权设为该人参与的通话长度之和。现在给定一个阈值K,且只要一个组的总边权超过K,并满足成员人数超过2,则将该组视为“犯罪团伙(Gang)”,而该组内点权最大的人视为头目。

要求输出“犯罪团伙”的个数,并按头目姓名字典序从小到大的顺序输出每个“犯罪团伙”的头目姓名和成员人数。

二、算法实现

#include<iostream> 
#include<string>
#include<map>
using namespace std;

const int maxn=2010;
const int inf=1000000000;

map<int,string> intToString;
map<string,int> stringToInt;
map<string,int> Gang; 

int G[maxn][maxn]={0};
int weight[maxn]={0};

int n;  //通话记录数量 
int k;  //阈值 
int numPerson=0;  //总人数 

bool vis[maxn]={false};

int change(string str)
{
	if(stringToInt.find(str)!=stringToInt.end())   //能找到 
	{
		return stringToInt[str];
	}
	else  //没有找到 
	{
		stringToInt[str]=numPerson;
		intToString[numPerson]=str;
		//numPerson++;
		return numPerson++;  //骚操作!! 
	}		
}

//nowVisit:当前访问的结点
//head:头目
//numMember: 成员人数
//totalValue:团伙内总的通话时长 
void DFS(int nowVisit,int &head,int &numMember,int &totalValue)
{
	numMember++;
	vis[nowVisit]=true;
	if(weight[nowVisit]>weight[head])
	{
		head=nowVisit;
	} 
	for(int i=0;i<numPerson;i++)
	{
		if(G[nowVisit][i]>0)
		{
			totalValue+=G[nowVisit][i];
			G[nowVisit][i]=G[i][nowVisit]=0;
			if(vis[i]==false)
			{
				DFS(i,head,numMember,totalValue);
			}			
		}
	}	
}

void DFSTrave()
{
	for(int i=0;i<numPerson;i++)
	{
		if(vis[i]==false)
		{
			int head=i;  //老大 
			int numMember=0;  //团伙成员人数 
			int totalValue=0;  //团伙总的通话时长 
			
			DFS(i,head,numMember,totalValue);
			if(numMember>2&&totalValue>k)
			{
				Gang[intToString[head]]=numMember;
			}			
		}		
	}	
}

int main() 
{
	int w;  //通话时长 
	string str1,str2; //通话双方 
	cin>>n>>k;
	for(int i=0;i<n;i++)
	{
		cin>>str1>>str2>>w;
		int id1=change(str1);
		int id2=change(str2); 
		//边读入,边操作 
		weight[id1]+=w;
		weight[id2]+=w;
		G[id1][id2]+=w;
		G[id2][id1]+=w;		
	}
	DFSTrave();	
	cout<<Gang.size()<<endl;
	for(map<string,int>::iterator it=Gang.begin();it!=Gang.end();it++) 
	{
		cout<<it->first<<" "<<it->second<<endl;
	}
	return 0;
}

string转int函数

map<int,string> intToString;
map<string,int> stringToInt;
int numPerson=0;  //总人数 

int change(string str)
{
	if(stringToInt.find(str)!=stringToInt.end())   //能找到 
	{
		return stringToInt[str];
	}
	else  //没有找到 
	{
		stringToInt[str]=numPerson;
		intToString[numPerson]=str;
		//numPerson++;
		return numPerson++;  //骚操作!! 
	}		
}

 

YOLOv12环境配置,手把手教你使用YOLOv12训练自己的数据集和推理(附YOLOv12网络结构图),全文最详细教程 YOLO 系统尊嘟太卷了吧,YOLOv11 还没完明白,YOLOv12 就重磅来袭,YOLOv12 是由纽约州立大学联合中科院在 2025年2月19 日发布,从 YOLOv12 论文题目我们大概就知道做了那些更新 ,下图是YOLOv12 在 COCO 数据集上的性能表现引入区域注意力机制(area-attention):通过引入十字形窗口自我注意机制,沿水平和垂直条纹计算注意力机制,纵横交错的注意机制。如下图所示,区域注意力采用最多简单的等分方法,将特征地图垂直或水平划分为 L 个区域。 阅读详情

相关推荐

通过JLink下载实现工控MCU批量烧录实战案例

利用JLink下载工具实现高效稳定的工控MCU批量烧录,提升产线效率。案例详细解析了脚本配置与自动化流程,突出jlink下载的可靠性和可扩展性,适用于大规模嵌入式部署场景。

weixin_30205153的博客 814

PAT A1034团伙头目

题意: 给出N条通话记录,这些通话将他们分为若干组。每个组的总边权为该组内的所有通话的长度之和,每个人的点权设为该人参加的通话长度之和。给定阀值K,超过阀值且大于二人的组被视为犯罪团伙,而组内点权最大的人被视为头目,要求输出团伙个数和每个团伙的头目,以及成员个数。 思路: 首先是姓名字符串和编号的对应关系:map<string,int> 求某点相连的边权之和 进行图的遍历,获取每个连通块的头目、成员个数、总边权。 如果总边权>K,且人数>2,则记录为一个犯罪团伙 代码: ...

zane_wing的博客 242

MIKE11实战:平原河网水动力建模从入门到精通(附GIS数据处理技巧)

本文系统介绍了MIKE11软件在平原河网水动力建模中的完整实战流程。从GIS数据预处理、河网构建、参数率定到结果分析,详细阐述了构建可靠数字孪生模型的关键步骤与技巧,旨在帮助水利工程师高效解决平原地区复杂水流模拟的挑战,为防洪决策提供科学依据。

weixin_28419039的博客 689

PAT甲级A1034 Head of a Gang (30)

One way that the police finds the head of a gang is to check people's phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be t...

vir_lee的博客 204

PCB工艺-SI9000使用教程

本文介绍了阻抗计算工具SI9000的使用方法,重点讲解了微带线与带状线的区别、共面阻抗概念及参考面选择。通过USB差分走线实例,详细说明了如何选择计算模型、填写参数并确定线宽线距。文章还提供了层叠设计资料和工厂常规阻抗表格作为参考,建议制板时标注需控阻抗的线路供板厂调整。最后简单提及了嘉立创阻抗计算工具作为备选方案。

weixin_50120208的博客 2028

别再瞎试了!用Python+正交设计,5分钟搞定你的多因素实验方案

本文介绍了如何利用Python和正交设计高效优化多因素实验方案。正交设计通过精心设计的正交表,用最少的实验次数覆盖所有因素的水平组合,显著提升实验效率。文章详细讲解了正交设计的核心优势、Python实现工具链、实验实施与数据分析方法,以及高级技巧与常见问题解决方案,帮助读者快速掌握这一强大的实验优化技术。

weixin_42526087的博客 336

通话记录分析 --- 通话详情 之二

5.2 通话详情界面 在通话详情界面,主要是完成2个功能,展示通话详情,删除该条通话记录。 CallDetailActivity界面如下, 1,通话记录详情 CallDetailActivity的onCreate方法主要是加载界面布局。 主要在onResume方法中调用异步线程查询通话信息,调用流程图如下, CallDetailActivity的onResume

Jack的博客 3733

STM32Cube高效开发教程<基础篇>(一)----概述

一、 STM32系列器件和开发工具发展历史声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。一、 STM32系列器件和开发工具发展历史。

我的博客 187

PAT A1034

方法:用深度遍历,同时计算每个连通分量的结点数,及点权最大的结点。 注意点:1,输出的连通分量要求,结点数>2且点权之和大于指定值;2,题中有至多1000个记录,但至多会有2000个不同的名字。 #include #include #include #include #include using namespace std; const int maxn=2010; map mp;

weixin_37565706的博客 534

解决Office 365 SMTP问题:C#邮件发送详解

本文介绍了如何在C#中使用Office 365 SMTP服务发送邮件。重点讲解了正确配置SMTP客户端的关键参数:必须使用587端口并启用TLS加密(EnableSsl=true),同时通过NetworkCredential进行身份验证。虽然SmtpClient已不推荐用于新项目,但本文提供的代码示例仍适用于临时项目或系统维护,并建议未来可考虑使用MailKit等现代邮件库。文章还包含了错误处理机制,确保程序健壮性。

2501_90323865的博客 141

【Visual Assist X助手安装问题】Visual Assist X无法安装(双击安装包没反应) | Visual Assist X安装后在Visual Studio中找不到(亲测有效)

本文分享了Visual Assisant X助手的安装与使用问题的详细解决办法,因为网上搜集的信息比较少,所以有一定的参考价值。考虑到很多开发新手会遇到上述问题,可能对Windows系统不熟悉,所以相关操作步骤讲解的很详细!

dvlinker的技术专栏 6万+

PAT A1034 Head of a Gang (30分)【暴力+细心】⭐⭐⭐⭐⭐

目录疑问1. N是小于等于1000的,是使用邻接表还是邻接矩阵进行存储?2. 名字是三个字母,从样例上看,这三个字母是重复的?代码反思 疑问 1. N是小于等于1000的,是使用邻接表还是邻接矩阵进行存储? 《算法笔记》使用的是邻接矩阵。 2. 名字是三个字母,从样例上看,这三个字母是重复的? 不是重复的。 代码 #include<stdio.h> #include<map&gt...

yc_cy1999的博客 282

Natural Language Processing

作者:禅与计算机程序设计艺术 1.简介 自然语言处理(NLP)是研究如何使计算机理解和处理自然语言的理论和方法,目的是让电脑更好的理解、获取、生成、存储和沟通人类语言。20世纪80年代末,IBM的三位博士陈天奇、周博磊和王力雄在贝尔实验室创建了首个自然语言处理系统——“布莱克多·艾森豪威尔”(Bletc

AI天才研究院 726

【PAT】A1034 Head of a Gang 【并查集】

One way that the police finds the head of a gang is to check people’s phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be t...

elegant coder 1664

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

图的遍历&团伙头目

前言:在学习遍历图的过程中发现了这道题,用dfs和邻接矩阵实现遍历,还会用到map构造映射关系简化代码 题目:PAT 1034 思路:用邻接矩阵存储图(邻接表的访问操作还不熟练),可以看出图被分成好几个连通块,依次对每个连通块进行遍历得到该连通块中的头目、成员数、边权之和,再进行条件判断是否要存入答案map。 代码如下: #include <iostream> #include <algorithm> #include <cstdio> #include <st..

CTGUACM 254

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

PAT甲级 1034 团伙头目 哈希表

原题链接 警察找到团伙头目的一种方法是检查人们的通话。 如果 A 和 B 之间有通话,我们就说 A 和 B 是相关的。并且关联具有传递性,即如果 A 与 B 关联,B 与 C 关联,那么 A 与 C 也是关联的。 关联权重定义为两人之间所有通话的总时间长度。 一个“帮派”是一个由至少3个相互关联的人组成的群体,并且其总关联权重大于给定的阈值 K。 在每个帮派中,总权重最大的就是头目,数据保证每个帮派中总权重最大的人是唯一的。 你需要确定各个帮派以及帮派头目。 输入格式 第一行包含两个整数 N

赵小轩的博客 1071

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

1034 Head of a Gang (30 分)图的连通分量

题目 One way that the police finds the head of a gang is to check people’s phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to b...

大山喵写博客的地方 1295

PAT甲级 A1034

PAT甲级 A1034 题目详情 1034 Head of a Gang (30分) One way that the police finds the head of a gang is to check people’s phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be the total time

weixin_44065549的博客 406

PAT-ADVANCED1034——Head of a Gang

我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED 原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624 题目描述: 题目翻译: 1034 犯罪团伙的头目 警察发现一个犯罪团伙的头目的方法之一是:检查人们的...

清风阁 483

PAT A1034 Head of a Gang

一、题目大意 PAT A1034 给出若干人之间的通话记录,这些通话将他们分成若干组。每个组的总边权值为该组内所有通话的时间之和,每个人的点权为该人参与的通话时间之和。现在只要某个组的总边权值大于一个阈值 k,并且组内人数大于 2,就将该组视为“犯罪团伙(gang)”,该组内点权最大的人视为头目。要求输出“犯罪团伙”的数目,并按头目姓名字典序的方式输出每个“犯罪团伙”的头目姓名和人数。 二、解...

Armstrong的博客 232

PAT 1034 Head of a Gang C++版

PAT 1034 Head of a Gang C++版 1.题意 给出一串用户通话的记录(记录形式是[name1,name2,time])。互相之间有通话关系的算是在同一个团队中。现在让你求出有多少个团伙,并且求出这个团伙中通话最多的人,以及输出这个团伙的总人数。 2.分析 解决这个问题可以使用两种方法,两种方法都较简单。一种是深搜法,一种是并查集法。并查集对于解决这种问题十分适合。所以笔者强烈...

说文科技,做有态度的研究。 718

1034. Head of a Gang (30)-PAT甲级真题(图的遍历dfs)

1034. Head of a Gang (30) One way that the police finds the head of a gang is to check people's phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a

柳婼 の blog 4271

[图的DFS遍历]--犯罪团伙的头目和成员人数

#include <bits/stdc++.h> using namespace std; const int maxn = 2010; //最大顶点数 int n, k; //n次通话,通话总时长的阈值为k map<int, string> intToString; //编号--姓名 map<string, in...

圣托里尼的日落啊~的博客 407

PAT A 1034 Head of a Gang

题目要求通过电话记录找出犯罪团伙及其头目。团伙定义为超过2人且总通话时长超过阈值K的连通群体,头目为团伙中总通话时长最多的人。算法使用深度优先搜索(DFS)遍历图的连通块,统计每个团伙的成员数和总时长,最终输出按头目名字排序的结果。样例1中AAA和GGG作为头目各领导3人团伙,而样例2因不满足条件输出0。

whdehcy的博客 605

PAT A 1034[图的遍历/并查集]

注意点:编号转换函数;DFS中记录整个连通图的点权之和,总边权就是总点权的一半。 #include <bits/stdc++.h> using namespace std; const int maxn = 2010; unordered_map<int, string> idTostr; //编号->名字 unordered_map<string, int&g...

a_green_hand1的博客 330

1034 Head of a Gang带权并查集

1034 Head of a Gang PAT甲级带权并查集 题目传送门 并查集基础(通俗易懂) 原文链接 先扯一下,本人的第一篇博客,写的不好有错误请dalao指出,有问题可以一起讨论。这题并不是特别难,但我第一次写完完整的带权并查集,纪念一下。并查集还是挺基础的,主要就是init()、find(x)、join(x,y)三个函数,推荐看下链接,通俗易懂。当初大一上不是很理解,现在觉得当初好蠢。 思路: 就是tim记录每个人的通话时间,然后用并查集合并团伙,当一个团伙人数大于2并且总通话时间大于k

weixin_46173995的博客 923
上一篇: string转int函数
下一篇: 图的广搜
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值