题目1446:Head of a Gang(并查集操作)
题目链接:http://ac.jobdu.com/problem.php?pid=1446
详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus
参考代码:
//
// 1446 Head of a Gang.cpp
// Jobdu
//
// Created by PengFei_Zheng on 17/04/2017.
// Copyright © 2017 PengFei_Zheng. All rights reserved.
// #include <stdio.h>
#include <map>
#include <vector>
#include <string>
#include <string.h>
#include <algorithm>
#include <list>
#define maxn 1010
using namespace std; int parent[maxn];
int n, k, i;
int currNum;
map<string, int> baseMap; char marray[maxn][];
char resultArr[maxn][];
int callTime[maxn];
int singleCallTime[maxn];
int fatherArr[maxn];
int visit[maxn]; struct Node {
char name[];
int size;
} nodes[maxn]; //并查集寻找父亲节点
int findRoot(int x) {
while (parent[x] != x) {
x = parent[x];
}
return x;
} //并查集合并节点
void unionSet(int a, int b) { a = findRoot(a);
b = findRoot(b);
if (a == b) return;
if (a > b) {
parent[a] = b;
} else {
parent[b] = a;
}
} //初始化基本数据,这在以后会用到
void initData() {
baseMap.clear();
memset(callTime, , sizeof(callTime));
memset(visit, , sizeof(visit));
memset(singleCallTime, , sizeof(singleCallTime));
memset(fatherArr, , sizeof(fatherArr));
for (i = ; i < maxn; i++) {
parent[i] = i;
}
} //将字符串转为数字,否则后面不太好处理
int getCurrentNum(char c[]) {
int num = ;
map<string, int>::iterator it = baseMap.find(c);
if (it == baseMap.end()) {
currNum++;
num = currNum;
baseMap.insert(make_pair(c, num));
} else {
num = it->second;
}
return num;
} //记录每个人打电话的时间
void constructData(char a[], char b[], int anum, int bnum, int d) {
if (singleCallTime[anum] == ) {
singleCallTime[anum] = d;
} else {
singleCallTime[anum] += d;
}
strcpy(marray[anum], a);
strcpy(marray[bnum], b);
callTime[anum] += d;
callTime[bnum] += d;
} bool cmp(Node node1, Node node2) {
return strcmp(node1.name, node2.name) < ;
} int main() {
while (scanf("%d%d", &n, &k) != EOF) {
initData();
currNum = ;
char a[];
char b[];
int d;
for (i = ; i < n; i++) {
scanf("%s%s%d", a, b, &d);
int anum = getCurrentNum(a);
int bnum = getCurrentNum(b);
constructData(a, b, anum, bnum, d);
unionSet(anum, bnum);
} int tmpk = ;
for (i = ; i < currNum + ; i++) {
parent[i] = findRoot(i);
if (parent[i] == i) {
fatherArr[tmpk] = i;
tmpk++;
}
}
int num = ;
for (i = ; i < tmpk; i++) {
int size = ;
int allTime = ;
int maxTime = -;
int maxMem = ;
for (int j = ; j < currNum + ; j++) {
if (fatherArr[i] != && visit[j] == ) {
if (parent[j] == fatherArr[i]) {
size++;
allTime += singleCallTime[j];
if (callTime[j] > maxTime) {
maxTime = callTime[j];
maxMem = j;
}
visit[j] = ;
}
}
}
if (size < ) {
continue;
}
if (allTime <= k) {
continue;
}
strcpy(nodes[num].name, marray[maxMem]);
nodes[num].size = size;
num++;
}
sort(nodes, nodes + num, cmp);
printf("%d\n", num);
for (i = ; i < num; i++) {
printf("%s %d\n", nodes[i].name, nodes[i].size);
} }
return ;
} /**************************************************************
Problem: 1446
User: zpfbuaa
Language: C++
Result: Accepted
Time:30 ms
Memory:1096 kb
****************************************************************/
题目1446:Head of a Gang(并查集操作)的更多相关文章
- 九度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 ...
- ZOJ 3521 Fairy Wars oj错误题目,计算几何,尺取法,排序二叉树,并查集 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3521 ATTENTION:如果用long long 减小误差,这道题只能用 ...
- 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 ...
- hdu4829 带权并查集(题目不错)
题意: Information Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- 【bzoj3674】 可持久化并查集加强版
http://www.lydsy.com/JudgeOnline/problem.php?id=3674 (题目链接) 题意 维护并查集3个操作:合并:回到完成第k个操作后的状态:查询. Soluti ...
- 并查集 Union-Find
并查集能做什么? 1.连接两个对象; 2.查询两个对象是否在一个集合中,或者说两个对象是否是连接在一起的. 并查集有什么应用? 1. Percolation问题. 2. 无向图连通子图个数 3. 最近 ...
- hiho_1066_并查集
题目大意 给出N个操作,每个操作可能为两种类型之一: 1. 认定两个人属于同一个组织 2. 查询两个人是否是同一个组织 要求对于每个操作类型2,给出结果,即查询的两个人是否属于同一个组织.其中,任何人 ...
- 【进阶——种类并查集】hdu 1829 A Bug's Life (基础种类并查集)TUD Programming Contest 2005, Darmstadt, Germany
先说说种类并查集吧. 种类并查集是并查集的一种.但是,种类并查集中的数据是分若干类的.具体属于哪一类,有多少类,都要视具体情况而定.当然属于哪一类,要再开一个数组来储存.所以,种类并查集一般有两个数组 ...
- 【并查集】【模拟】Codeforces 698B & 699D Fix a Tree
题目链接: http://codeforces.com/problemset/problem/698/B http://codeforces.com/problemset/problem/699/D ...
随机推荐
- JAVABEAN必须继承序列化借口的作用
这里有人家对序列化的测试 http://www.javaeye.com/topic/350137 Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成 ...
- UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位 st_mod ...
- mac osx voice over的使用
mac下的filezilla是一个很奇葩的应用,奇葩在哪?有一次我不知道怎么操作的,把filezilla搬到到了窗体顶部,结果被mac的菜单栏挡住了标题栏,然后再也无法移动窗体了,以下是我为了移动它做 ...
- js实现图片粘贴上传到服务器并展示
最近看了一些有关于js实现图片粘贴上传的demo,实现如下: (这里只能检测到截图粘贴和图片右键复制之后粘贴) demo1: document.addEventListener('paste', fu ...
- 2018年7月份,python上传自己的包库到pypi官网的方法
最近pypi官网进行了更新,老的上传网址作废了.记录下上传到pypi的方法 0.去pypi官网注册账号,没账号是不可能上传的,想想也是那不乱套了吗,注册后会收到一个邮件需要点击然后重新登录 1.目录就 ...
- 第六种方式,python使用cached_property缓存装饰器和自定义cached_class_property装饰器,动态添加类属性(三),selnium webdriver类无限实例化控制成单浏览器。
使用 from lazy_object_proxy.utils import cached_property,使用这个装饰器. 由于官方的行数比较少,所以可以直接复制出来用自己的. class cac ...
- Python一个简单的数据库类封装
#encoding:utf-8 #name:mod_db.py '''使用方法:1.在主程序中先实例化DB Mysql数据库操作类. 2.使用方法:db=database() db.fet ...
- [OpenCV] Samples 01: Geometry - 几何图形
前言 基本的几何图形,标注功能. commondLineParser的使用参见:http://blog.csdn.net/u010305560/article/details/8941365 #inc ...
- 8 -- 深入使用Spring -- 7...3 让Spring管理控制器
8.7.3 让Spring管理控制器 让Spring容器来管理应用中的控制器,可以充分利用Spring的IoC特性,但需要将配置Struts 2 的控制器部署在Spring容器中,因此导致配置文件冗余 ...
- UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multib
[问题] 在执行代码时,提示上述错误,源码如下: # 下载小说... def download_stoy(crawl_list,header): # 创建文件流,将各个章节读入内存 with open ...