博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT1034 Head of a Gang (30)(并查集)
阅读量:7282 次
发布时间:2019-06-30

本文共 1770 字,大约阅读时间需要 5 分钟。

题意:

给出n次通话记录,当通话的人数超过2人并且通话总时长超过k时,这些人就是犯罪团伙,其中通话时间最大的人是头目,要求按字母序输出头目和团伙人数

思路:

就是并查集,将两两通话的人关联在一起,因为通话的人的姓名是按三位字母给出的,所以要离散化,并且对应要用一些STL保存映射。我自己写的时候有两个点没过,后来改过了,错误原因写在下面注释里了。网上的代码也有用DFS找连通分量做的。

#include
#include
#include
#include
#include
#include
using namespace std;const int INF = 0xfffff;const int maxn = 2010; //这里开1005会出现段错误,因为是n个通话可能有2n个人map
gang;map
gangName;int gangTime[maxn];int p[maxn];int n, k,pos=0;vector
head[maxn];set
res;void init() { for (int i = 0; i < maxn; i++) { p[i] = i; head[i].push_back(i); }}int find(int x) { if (x == p[x]) return x; return p[x] = find(p[x]);}void merge(int x, int y) { x = find(x); y = find(y); if (x != y) { p[x] = y; for (auto i = head[x].begin(); i != head[x].end(); i++) { head[y].push_back(*i); } head[x].clear(); //这里必须清零 }}int main() { scanf("%d%d", &n, &k); init(); for (int i = 0; i < n; i++) { string name1, name2; int time; cin >> name1 >> name2 >> time; if (gang.find(name1) == gang.end()) { gang[name1] = pos; gangName[pos++] = name1; } if (gang.find(name2) == gang.end()) { gang[name2] = pos; gangName[pos++] = name2; } gangTime[gang[name1]] += time; gangTime[gang[name2]] += time; merge(gang[name1], gang[name2]); } for (int i = 0; i < pos; i++) { if (head[i].size() > 2) { int maxTime = -1, index; int totalTime = 0; for (auto x : head[i]) { if (maxTime < gangTime[x]) { maxTime = gangTime[x]; index = x; } totalTime += gangTime[x]; } if (totalTime > 2*k) { res.insert(gangName[index]); } } } if (res.empty()) cout << 0 << endl; else { cout << res.size() << endl; for (auto x : res) { int h = find(gang[x]); cout << x << " " << head[h].size() << endl; } } return 0;}

 

转载于:https://www.cnblogs.com/seasonal/p/10343631.html

你可能感兴趣的文章
如何启用SAP C4C OData Event Notification
查看>>
Js传递数组参数到后台controller的方式
查看>>
名师课堂-Java高级开发
查看>>
2.1.3 Python面向对象之异常处理
查看>>
对话 | 浅析NEO的dBFT共识算法
查看>>
阿里研究院入选中国企业智库系统影响力榜
查看>>
[译] 解密 Mapbox 卫星影像处理神器 Robosat
查看>>
什么是闭包?闭包的优缺点?
查看>>
991. Broken Calculator
查看>>
Spring MVC+Stomp+Security+H2 Jetty
查看>>
探究call 和 apply 的原理
查看>>
988-从叶结点开始的最小字符串
查看>>
莫比乌斯反演初步与实际应用
查看>>
最佳在线图表软件
查看>>
java中具有继承关系的类及其对象初始化顺序
查看>>
Intellij IDEA 开发 Spring-boot项目 热部署,自动部署
查看>>
PHP 实现归并排序算法
查看>>
GraphQL 学习
查看>>
3分钟带你看懂android中的Binder机制
查看>>
说说vue-cli中使用flexible和px2rem-loader
查看>>