题目地址: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的巧妙使用---图的入门题目)相关推荐

  1. pat 甲级 1034. Head of a Gang (30)

    1034. Head of a Gang (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue One wa ...

  2. C++实现邻接矩阵存储的图及dfs遍历

    #include <iostream> using namespace std; #define MaxInt 1e8 #define MVNum 100//最大顶点数 typedef c ...

  3. [C] 图的深度优先遍历

    图的DFS遍历 首先我们需要知道什么是图 简单地说,图就是由一些小圆点(称为顶点)和连接这些小圆点的直线(称为边)组成的.例如上图是由五个顶点(编号为1,2,3,4,5)和五条边(1-2,1-3,1- ...

  4. 二十三、图的广度优先遍历

    二十三.图的广度优先遍历 文章目录 二十三.图的广度优先遍历 题目描述 解题思路 上机代码 题目描述 程序的输入是无向图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-1,-1为结束标志).程序 ...

  5. 并查集之LeetCode1579. 保证图可完全遍历

    并查集之LeetCode1579. 保证图可完全遍历 前言 一,1579. 保证图可完全遍历 二,解题思路 三, 代码 总结 前言 算法之并查集 一,1579. 保证图可完全遍历 Alice 和 Bo ...

  6. 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 ...

  7. 1034 Head of a Gang(图的DFS解法) 擦边大法好

    1.题目的大意是给出很多人(结点)之间的通话记录,每两人之间的权重取决于他俩通话权重的总时长,如果一个社区的人数超过2且社区内发生的通话总时长超过给定阈值,那么这属于一个社区.最后要求输出社区的总数, ...

  8. 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 ...

  9. Pat乙级 1034 有理数四则运算

    Pat乙级 1034 有理数四则运算 思路 代码 题目网址 https://pintia.cn/problem-sets/994805260223102976/problems/99480528762 ...

  10. PAT乙级(1034 有理数四则运算)

    PAT乙级 1034 有理数四则运算 题目描述 解题代码 PAT解题所有题目 可看该模块下其他文章 代码涉及c++和c  供大家一起参考学习! 输入格式: 输入在一行中按照 a1/b1 a2/b2 的 ...

最新文章

  1. 用node实现websocket协议
  2. Ubuntu16安装CUDA9.0+Anaconda+Tensorflow1.8GPU(2018.08.20最新)
  3. 互联网技术架构的启示
  4. python dict初始化大小_在Python中初始化/创建/填充Dict的Dict
  5. 免密登录堡垒机和服务器
  6. 信息学奥赛C++语言:由大到小输出1~100的整数
  7. 写在发现谷歌拼音输入法网站消失的今天
  8. Java基础面试题整理-50题(附答案)
  9. Win10桌面背景消失了变黑的解决方法
  10. FaceBook和Google广告API接口文档
  11. python操作格林威治时间
  12. TypeScript查缺补漏
  13. postman发送图片
  14. 找出集合中重复元素和不重复元素
  15. 无人驾驶能解决什么问题?
  16. (远程控制)App inventor 编写安卓app控制 ESP8266
  17. 解决 ‘GDK_IS_DISPLAY (display)‘ failed
  18. SwiftUI如何在动画完成时得到通知
  19. 游戏感:虚拟感觉的游戏设计师指南——第十五章 超级马里奥64
  20. Android 下载文件获取对应链接文件的名称及扩展名

热门文章

  1. 删除XP防盗版补丁(转)
  2. 正则表达式非捕获分组?:
  3. 【Linux】目录中 / 和 ~ 的区别
  4. pyzabbix 删除触发器_Zabbix实现批量监控端口状态的方法
  5. Java基础IDEA快捷键
  6. 服务端访问Linux的DNS出现DNS request timed out..
  7. Android查看appPackage和Activity的多种方法
  8. tornado(五)
  9. 读书笔记之深入理解Java虚拟机
  10. 《软件定义网络:基于OpenFlow的SDN》一一3.4 本章总结