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 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
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
map<string , int> mp1;
map<int, string>mp2;
map<string, int> ans;
int G[][] = {}, personNum = , time_[] = {};
int N, K, visit[] = {};
int str2num(string ss){
if(mp1.count(ss) == ){
mp1[ss] = personNum;
mp2[personNum] = ss;
return personNum++;
}else return mp1[ss];
}
void dfs(int v, int &sum, int &head, int &cnt){
visit[v] = ;
cnt++;
if(time_[head] < time_[v])
head = v;
for(int i = ; i < personNum; i++){
if(G[v][i] != ){
sum += G[v][i];
G[v][i] = G[i][v] = ;
if(visit[i] == )
dfs(i, sum, head, cnt);
}
}
}
int main(){
//std::ios::sync_with_stdio(false);
cin >> N >> K;
string str1, str2;
int we;
for(int i = ; i < N; i++){
cin >> str1 >> str2 >> we;
int e1 = str2num(str1);
int e2 = str2num(str2);
G[e1][e2] += we;
G[e2][e1] += we;
time_[e1] += we;
time_[e2] += we;
}
int gangs = ;
for(int i = ; i < personNum; i++){
if(visit[i] == ){
int sum = , cnt = , head = i;
dfs(i, sum, head, cnt);
if(sum > K && cnt > ){
gangs++;
ans[mp2[head]] = cnt;
}
}
}
cout << gangs << endl;
map<string, int>::iterator it;
for(it = ans.begin(); it != ans.end(); it++){
cout << it->first << " " << it->second << endl;
}
return ;
}
总结:
1、题意:一个连通子图的节点数大于2,且它的边权的和大于K,就说明是gang,其中这个子图中与他人通话时长之和最多的节点被认为是头领。要求输出头领和该子图的节点个数。
2、首先是字符串作为节点的id需要被编号。起初看到只有3位想将其映射为26*26*26进制,但其实太大了而且有好多节点有可能是空的,这样从0遍历到26*26*26遍历的话时间上会超时。 所以只能使用map,映射从int到string,string到int。再使用一个计数器统一分配从0开始的节点编号。
3、由于深搜的原则是所有节点只遍历一次,使用了visit数组记录一个点是否被访问过。但本题实际上要求遍历连通图的所有边(获取整个gang的通话时长总和),如果仅仅按照点的方法遍历,很可能漏掉一些边。 所以
- 要在判断遍历A的所有联通的点是否被visit了之前就先访问一次他们之间的边。
- 其次为了防止回溯之后重复访问某条边,需要在累加完这条边之后立即置0。
第一种情况,深度搜索按照A->B->C的顺序访问节点,A时可以得到AB边,B时可以得到BC边,当访问C节点时,由于A被标记为visit,所以CA无法得到。这是回溯到A节点,A无法访问C(C被标记为visit),故AC边被漏掉了。
第二种情况,已经在判断visited之前加上了某条边,还会出重复访问某条边的情况。比如与之前类似,A->B->C的顺序访问,当访问到C时,由于这次是在判断visit之前先访问边,所以边CA被访问。结束后回溯到A,A再次测试C节点(不可访问,被标记visit),这是会再访问一次边AC,造成重复访问。
4、对于无向图,一定要对G[ i ][ j ]与G[ j ][ i ]同时操作。
5、本题判断谁是头目采用找点权最大的节点,这个可以在读入数据的时候就计算,不必等到遍历的时候。其次,由于是通话记录,所以可能会有多个A->B,B->A的记录,图上的边权是累加的而不是赋值(A->B需要给AB与BA边累加,B->A同样要给AB与BA累加)。
6、map<key, val>中,存储是按key递增的顺序记录的,遍历即可得到递增序列。
A1034. Head of a Gang的更多相关文章
- PAT A1034 Head of a Gang (30 分)——图遍历DFS,字符串和数字的对应保存
One way that the police finds the head of a gang is to check people's phone calls. If there is a pho ...
- PAT_A1034#Head of a Gang
Source: PAT A1034 Head of a Gang (30 分) Description: One way that the police finds the head of a gan ...
- PAT (Advanced Level) Practice(更新中)
Source: PAT (Advanced Level) Practice Reference: [1]胡凡,曾磊.算法笔记[M].机械工业出版社.2016.7 Outline: 基础数据结构: 线性 ...
- PAT A1034 Head Of Gang
用并查集分割团伙,判断输出~ #include<bits/stdc++.h> using namespace std; ; },weight[maxn]; unordered_map< ...
- 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 ...
- 1034. Head of a Gang (30)
分析: 考察并查集,注意中间合并时的时间的合并和人数的合并. #include <iostream> #include <stdio.h> #include <algor ...
- [BZOJ1370][Baltic2003]Gang团伙
[BZOJ1370][Baltic2003]Gang团伙 试题描述 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: ...
- Head of a Gang (map+邻接表+DFS)
One way that the police finds the head of a gang is to check people's phone calls. If there is a pho ...
- 九度OJ 1446 Head of a Gang -- 并查集
题目地址:http://ac.jobdu.com/problem.php?pid=1446 题目描述: One way that the police finds the head of a gang ...
随机推荐
- checkout 多选 全选(亲测有效)
<input type="button" id="btn1" value="全选"> <input type=" ...
- MySQL Connector/ODBC 2.50 (MyODBC 2.50)连接方式
一.MySQL Connector/ODBC 2.50 (MyODBC 2.50)连接方式 1.本地数据库连接Driver={MySQL};Server=localhost;Option=16834; ...
- 字符串正则替换replace第二个参数是函数
zepto中 //将字符串转成驼峰式的格式 camelize = function (str) { return str.replace(/-+(.)?/g, function (match, chr ...
- linux audit审计(6)--audit永久生效的规则配置
定义reboot系统后,仍然生效的审计规则,有两种办法: 1.直接写入/etc/audit/audit.rules文件中,在service文件中需要加入ExecStartPost=-/sbin/aud ...
- 老男孩python学习自修第十三天【md5加密】
示例代码如下: hashlib_test.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import hashlib def genPasswd(na ...
- Python自动化运维ansible从入门到精通
1. 下载安装 在windows下安装ansible:
- 怎样利用ADO中的adoquery进行缓存更新?????(100分)
我用BDE时,用query与updatesql相结合进行缓存更新,但是在ADO中没有updatesql,只有用adoquery,在DBGRID中,用CANCELUPADTE,只能取消一条记录,烦恼不已 ...
- TestNG之测试执行后没有生成默认测试报告(IDEA)
使用IDEA+TestNG进行测试,没有生成 测试报告,是因为没有勾选监听器使用默认报告,具体操作如下: “Run” -> "Edit Configurations" -&g ...
- group by具有去重的功能
group by具有去重的功能
- Nginx http2.0
109/110 HTTP2.0协议 优势必须使用TLS加密 传输数据量大幅减少 1:以二进制格式传输 2:标头压缩(header做压缩) 多路复用及相关功能 : 消息优先级 (比如样式表先渲染页面那 ...