【PAT】A-1034 :Head of a Gang(图的DFS遍历和map的巧妙使用---图的入门题目)
题目地址:https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624
题目解释:
给出若干人之间的通话长度(无向图),这些通话将他们分为若干组。每个组的总边权为该组内的所有的通话长度之和,而每个人的点权设为该人参与的通话长度之和。现在给定一个阈值K,且只要一个组的总边权超过K,并满足组内成员数超过2,则将该组视为“犯罪团伙Gang”,而该组内点权最大的人视为头目。要求输出“犯罪团伙”的个数,并按照头目姓名的字典序从小到大的顺序输出每个“犯罪团伙”的头目姓名和成员人数。
解题思路:
1.由于通话记录最多有1000条,那么最多有2000人,数组的大小要设为2000+。
2.巧妙使用map,实现姓名和该人的序号的对应。且对于map<type1,type2>是自动按照type1从小到大进行排序的,符合题目要求的按照字典序从小到达输出的要求。
可能会用到的map的函数有.size() .find(type) .begin() .end()等
3.采用dfs遍历,注意遍历的时候不要出现回退的情况。所以在遇到下一个可以到达的点的时候,先累加边权,再将该条边的边权置0,变成不可再走的边。
ac代码:
#include <iostream>
#include <string>
#include <map>
#define maxn 2020
#define INF 10000000000
using namespace std;
int G[maxn][maxn]={0},weight[maxn]={0};//邻接矩阵存边权,点权
int n,k,w,numperson=0;
bool vis[maxn]={false};
map<string,int> Stringtoint;//姓名->序号
map<int,string> intTostring;//序号->姓名
map<string,int> Gang;//最后输出,字典序从小到大
void DFS(int nowvis,int &head,int &numMeber,int &totalvalue)//遍历过程中不断更新head,numMeber和totalvalue
{numMeber++;//成员数+1vis[nowvis]=true;if(weight[nowvis]>weight[head])head=nowvis;for(int i=0;i<numperson;i++){if(G[nowvis][i]>0)//可访问{totalvalue+=G[nowvis][i];G[nowvis][i]=G[i][nowvis]=0;//删除该条边,防止回头if(!vis[i])DFS(i,head,numMeber,totalvalue);}}
}
void DFSTrave()
{for(int i=0;i<numperson;i++){if(!vis[i]){int head=i,numMeber=0,totalvalue=0;DFS(i,head,numMeber,totalvalue);if(numMeber>2 && totalvalue>k)Gang[intTostring[head]]=numMeber;}}
}
int change(string str)
{if(Stringtoint.find(str)!=Stringtoint.end())return Stringtoint[str];else{Stringtoint[str]=numperson;intTostring[numperson]=str;return numperson++;}
}
int main()
{cin>>n>>k;string str1,str2;for(int i=0;i<n;i++){cin >> str1 >> str2 >> w;int di1 = change(str1);//di为序号int di2 = change(str2);weight[di1] += w;weight[di2] += w;G[di1][di2] += w;G[di2][di1] += w;//无向图的边权}DFSTrave();cout<<Gang.size()<<endl;map<string,int>::iterator it;for(it=Gang.begin();it!=Gang.end();it++)cout<<it->first<<" "<<it->second<<endl;return 0;
}
【PAT】A-1034 :Head of a Gang(图的DFS遍历和map的巧妙使用---图的入门题目)相关推荐
- pat 甲级 1034. Head of a Gang (30)
1034. Head of a Gang (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue One wa ...
- C++实现邻接矩阵存储的图及dfs遍历
#include <iostream> using namespace std; #define MaxInt 1e8 #define MVNum 100//最大顶点数 typedef c ...
- [C] 图的深度优先遍历
图的DFS遍历 首先我们需要知道什么是图 简单地说,图就是由一些小圆点(称为顶点)和连接这些小圆点的直线(称为边)组成的.例如上图是由五个顶点(编号为1,2,3,4,5)和五条边(1-2,1-3,1- ...
- 二十三、图的广度优先遍历
二十三.图的广度优先遍历 文章目录 二十三.图的广度优先遍历 题目描述 解题思路 上机代码 题目描述 程序的输入是无向图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-1,-1为结束标志).程序 ...
- 并查集之LeetCode1579. 保证图可完全遍历
并查集之LeetCode1579. 保证图可完全遍历 前言 一,1579. 保证图可完全遍历 二,解题思路 三, 代码 总结 前言 算法之并查集 一,1579. 保证图可完全遍历 Alice 和 Bo ...
- PAT:1034 Head of a Gang (30分)
1034 Head of a Gang (30分) One way that the police finds the head of a gang is to check people's phon ...
- 1034 Head of a Gang(图的DFS解法) 擦边大法好
1.题目的大意是给出很多人(结点)之间的通话记录,每两人之间的权重取决于他俩通话权重的总时长,如果一个社区的人数超过2且社区内发生的通话总时长超过给定阈值,那么这属于一个社区.最后要求输出社区的总数, ...
- 1034 Head of a Gang (30 分) One way that the police finds the head of a gang is to check people‘s pho
立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 One way that the police finds the head of a gang is to check peop ...
- Pat乙级 1034 有理数四则运算
Pat乙级 1034 有理数四则运算 思路 代码 题目网址 https://pintia.cn/problem-sets/994805260223102976/problems/99480528762 ...
- PAT乙级(1034 有理数四则运算)
PAT乙级 1034 有理数四则运算 题目描述 解题代码 PAT解题所有题目 可看该模块下其他文章 代码涉及c++和c 供大家一起参考学习! 输入格式: 输入在一行中按照 a1/b1 a2/b2 的 ...
最新文章
- 用node实现websocket协议
- Ubuntu16安装CUDA9.0+Anaconda+Tensorflow1.8GPU(2018.08.20最新)
- 互联网技术架构的启示
- python dict初始化大小_在Python中初始化/创建/填充Dict的Dict
- 免密登录堡垒机和服务器
- 信息学奥赛C++语言:由大到小输出1~100的整数
- 写在发现谷歌拼音输入法网站消失的今天
- Java基础面试题整理-50题(附答案)
- Win10桌面背景消失了变黑的解决方法
- FaceBook和Google广告API接口文档
- python操作格林威治时间
- TypeScript查缺补漏
- postman发送图片
- 找出集合中重复元素和不重复元素
- 无人驾驶能解决什么问题?
- (远程控制)App inventor 编写安卓app控制 ESP8266
- 解决 ‘GDK_IS_DISPLAY (display)‘ failed
- SwiftUI如何在动画完成时得到通知
- 游戏感:虚拟感觉的游戏设计师指南——第十五章 超级马里奥64
- Android 下载文件获取对应链接文件的名称及扩展名