PAT 1034 Head of a Gang[难][dfs]
1034 Head of a Gang (30)(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 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 threshold, 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,一个帮派的定义是人数大于2,必须是3人或者3人以上,并且总的通话时长要>k,=k不可以,满足这两个条件,就可以被称为一个帮派,在一个帮派内部,需要找出累计通话时长最多的人,那个人就是头,并且输出帮派内总人数。
//和普通的不一样的就是,现在图的下标不是用数字来表示了,而是用字母。
//虽然说可以用并查集,但是在一个数组里也不好遍历。set也不好用,除非结构体里设置很多属性,但是这样维护起来不好维护。好麻烦啊这道题。看似简单。
大佬代码:
#include <iostream>
#include <map>
using namespace std;
map<string, int> stringToInt;
map<int, string> intToString;
map<string, int> ans;
int idNumber = , k;
int stoifunc(string s) {
if(stringToInt[s] == ) {//如果不存在,那么就加入map里
stringToInt[s] = idNumber;
intToString[idNumber] = s;//两方都存上。
return idNumber++;
} else {
return stringToInt[s];
}
}
int G[][], weight[];
bool vis[];
void dfs(int u, int &head, int &numMember, int &totalweight) {//使用引用传值,并且可以得到返回值。
vis[u] = true;
numMember++;
if(weight[u] > weight[head])
head = u;
for(int v = ; v < idNumber; v++) {
if(G[u][v] > ) {
totalweight += G[u][v];
G[u][v] = G[v][u] = ;//赋值为0,避免多次计算。
if(vis[v] == false)
dfs(v, head, numMember, totalweight);//totalWeight是只计算边。
}
}
} void dfsTrave() {
for(int i = ; i < idNumber; i++) {//如果有多个连通分量
if(vis[i] == false) {//被访问过的都被标记为了true
int head = i, numMember = , totalweight = ;
dfs(i, head, numMember, totalweight);//这里为什么传了两个呢?因为第一个i只是表示从它开始遍历,而第二个head才是真正的头。
if(numMember > && totalweight > k)
ans[intToString[head]] = numMember;
}
}
}
int main() {
int n, w;
cin >> n >> k;
string s1, s2;
for(int i = ; i < n; i++) {
cin >> s1 >> s2 >> w;
int id1 = stoifunc(s1);
int id2 = stoifunc(s2);
weight[id1] += w;//这里记录上每个点的总通话时长。
weight[id2] += w;
G[id1][id2] += w;//两点之间也加上,并且是不分单向双向的。
G[id2][id1] += w;
}
dfsTrave();
cout << ans.size() << endl;
for(auto it = ans.begin(); it != ans.end(); it++)
cout << it->first << " " << it->second << endl;
return ;
}
//简直不要太厉害了。
1.没有使用结构体,我想的是使用结构体,但是那样也十分不方便。
2.怎样区分帮派呢?我一开始想的就很乱,使用dfs。计数总共有多少人,并且点有点的权重,边之间也有,它们是不混淆的,并且没有使用并查集,对总体进行一个循环,并且每次从这个点出发去访问后就会标记该点,并且判断条件是边之间>0,那么一次循环下来,一个帮派内的就会被遍历到。
3.使用引用传值,https://blog.csdn.net/zx3517288/article/details/53363798/
这篇文章讲传值传地址,十分好。
4.关键是使用邻接矩阵来存储边了,但是我都没有想到。
PAT 1034 Head of a Gang[难][dfs]的更多相关文章
- PAT 1034. Head of a Gang
1034. Head of a Gang (30) One way that the police finds the head of a gang is to check people's phon ...
- PAT 1034. Head of a Gang (30)
题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1034 此题考查并查集的应用,要熟悉在合并的时候存储信息: #include <iostr ...
- PAT 1034. Head of a Gang[bug]
有一个两分的case出现段错误,真是没救了,估计是要写bfs的形式,可能栈溢出了 #include <cstdio> #include <cstdlib> #include & ...
- PAT甲级1034. Head of a Gang
PAT甲级1034. Head of a Gang 题意: 警方找到一个帮派的头的一种方式是检查人民的电话.如果A和B之间有电话,我们说A和B是相关的.关系的权重被定义为两人之间所有电话的总时间长度. ...
- pat 甲级 1034. Head of a Gang (30)
1034. Head of a Gang (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue One wa ...
- PAT 甲级 1034 Head of a Gang (30 分)(bfs,map,强连通)
1034 Head of a Gang (30 分) One way that the police finds the head of a gang is to check people's p ...
- pat 甲级 1034 ( Head of a Gang )
1034 Head of a Gang (30 分) One way that the police finds the head of a gang is to check people's pho ...
- 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 pho ...
- PAT Advanced 1034 Head of a Gang (30) [图的遍历,BFS,DFS,并查集]
题目 One way that the police finds the head of a gang is to check people's phone calls. If there is a ...
随机推荐
- 【C#新特性】不用out ref同时返回多个值-元组Tuple
元组Tuple,它是一种固定成员的泛型集合 下面先看看官方的一个使用例子: 创建一个包含7个元素的Tuple数组 // Create a 7-tuple. , , , , , );// Display ...
- 【cs229-Lecture13】高斯混合模型
本节内容: 1.混合高斯模型: 2.将混合高斯模型应用到混合贝叶斯模型:(应用:文本聚类) 3.结合EM算法,讨论因子分析算法: 4.高斯分布的有用性质. 混合高斯模型 将一般化的EM算法流程(下载笔 ...
- java框架---->mybatis的使用(一)
这里我们记录一些mybatis的一些常用知识和项目中遇到的问题总结.快乐人生的三个必要元素是,有要做的事.热爱的事及盼望的事. mybatis的一些知识 一.mybatis插入返回主键值 插入的jav ...
- canvas练习 - 圆
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CSS学习之盒子模型
1. 前言 盒子模型,英文即box model.无论是div.span.还是a都是盒子. 但是,图片.表单元素一律看作是文本,它们并不是盒子.这个很好理解,比如说,一张图片里并不能放东西,它自己就是自 ...
- [原]git的使用(六)---远程仓库
10.远程仓库 -------------------------------------------------------------------------------------------- ...
- C语言位操作--奇偶校验算法
信息是以比特流的方式传输的,类似01000001.在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1.为了检测到这种错误,我们可以通过 ...
- Dockerfile的一些demo
tomcat7.0_jdk1.6 #继承用户创建的sshd镜像FROM yatho:sshd_ubuntu #创建者的基本信息 MAINTAINER yatho (yat_ho@163.com) #设 ...
- windows桌面通知区域不显示音量图标的解决方法
在windows系统桌面通知区域一般都是显示的输入法.电源.网络.音量及托盘的应用程序等内容 通知区域图标显示与否与控制面板的通知区域图标的设置有关,我们有时会遇到通知区域不显示个别图标的情况,如不显 ...
- 【BZOJ5094】硬盘检测 概率
[BZOJ5094]硬盘检测 Description 很久很久以前,小Q买了一个大小为n单元的硬盘,并往里随机写入了n个32位无符号整数.因为时间过去太久,硬盘上的容量字眼早已模糊不清,小Q也早已忘记 ...