Back to Underworld(lightoj 1009)
Time Limit: 4 second(s) | Memory Limit: 32 MB |
The Vampires and Lykans are fighting each other to death. The war has become so fierce that, none knows who will win. The humans want to know who will survive finally. But humans are afraid of going to the battlefield.
So, they made a plan. They collected the information from the newspapers of Vampires and Lykans. They found the information about all the dual fights. Dual fight means a fight between a Lykan and a Vampire. They know the name of the dual fighters, but don't know which one of them is a Vampire or a Lykan.
So, the humans listed all the rivals. They want to find the maximum possible number of Vampires or Lykans.
Input
Input starts with an integer T (≤ 10), denoting the number of test cases.
Each case contains an integer n (1 ≤ n ≤ 105), denoting the number of dual fights. Each of the next n lines will contain two different integers u v (1 ≤ u, v ≤ 20000) denoting there was a fight between u and v. No rival will be reported more than once.
Output
For each case, print the case number and the maximum possible members of any race.
Sample Input |
Output for Sample Input |
2 2 1 2 2 3 3 1 2 2 3 4 2 |
Case 1: 2 Case 2: 3 |
Note
Dataset is huge, use faster I/O methods.
思路:并查集;
我们要把上面的点分成两个阵营,p-q表示p,q这两个点是对立的是不同的阵营,那么我们将每一个点分别构造两个不同的阵营,假如是点P;
那么(p,p+cnt)就为两个不同的阵营的表示法,P-q;也就是p和q+cnt是一个阵营,q和p+cnt是一个阵营,因为p和p+cnt对立,同理。
那么我们就用并差集来合并,然后最后我们可以得到多个集合,并且,其中的每个集合,在这些集合中我们可以找到他的对立集合,所以我们贪心选取,两个集合中最大的那个,加入sum。
(注:每个两个点最多有3种关系,1,同一阵营,2不同阵营,3没有关系)
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<stdlib.h>
6 #include<queue>
7 #include<map>
8 using namespace std;
9 int du[20005*3];
10 int str[3*20005];
11 int flag[3*20005];
12 typedef struct pp
13 {
14 int x;
15 int y;
16 }ss;ss aa[100005];
17 map<int,int>my;
18 int main(void)
19 {
20 int n,i,j,k,p,q;
21 int s;
22 scanf("%d",&k);
23 for(s=1;s<=k;s++)
24 { my.clear();
25 scanf("%d",&n);memset(flag,0,sizeof(flag));
26 for(i=0;i<3*20005;i++)
27 {str[i]=i;du[i]=1;}
28 int cnt=1;
29 for(i=0;i<n;i++)
30 {
31 scanf("%d %d",&aa[i].x,&aa[i].y);
32 if(my[aa[i].x]==0)
33 my[aa[i].x]=cnt++;
34 aa[i].x=my[aa[i].x];
35 if(my[aa[i].y]==0)
36 my[aa[i].y]=cnt++;
37 aa[i].y=my[aa[i].y];
38 }
39 for(i=cnt;i<3*20005;i++)
40 du[i]=0;
41 for(i=0;i<n;i++)
42 {
43 int x=aa[i].x;
44 int y=aa[i].y;
45 int xx=x+cnt-1;
46 int yy=y+cnt-1;
47 int c,c1,c2,c3;
48 for(c=x;str[c]!=c;)
49 c=str[c];
50 for(c1=y;c1!=str[c1];)
51 c1=str[c1];
52 for(c2=xx;str[c2]!=c2;)
53 c2=str[c2];
54 for(c3=yy;c3!=str[c3];)
55 c3=str[c3];
56 if(c!=c3)
57 {
58 if(du[c]>=du[c3])
59 {
60 du[c]+=du[c3];
61 str[c3]=c;
62 }
63 else {du[c3]+=du[c];str[c]=c3;}
64 }
65 if(c1!=c2)
66 {
67 if(du[c2]>=du[c1])
68 {
69 du[c2]+=du[c1];
70 str[c1]=c2;
71 }
72 else
73 {
74 du[c1]+=du[c2];
75 str[c2]=c1;
76 }
77 }
78 }int sum=0;
79 for(i=1;i<cnt;i++)
80 {
81 int c,d;
82 for(c=i;c!=str[c];)
83 {c=str[c];}
84 for(d=i+cnt-1;d!=str[d];)
85 {d=str[d];}
86 if(!flag[c])
87 {
88 sum+=max(du[c],du[d]);
89 flag[c]=1;flag[d]=1;
90 }
91 }
92 printf("Case %d: %d\n",s,sum);
93 }return 0;
94 }
Back to Underworld(lightoj 1009)的更多相关文章
- Lightoj 1009 - Back to Underworld
1009 - Back to Underworld PDF (English) Statistics Forum Time Limit: 4 second(s) Memory Limit: 32 ...
- LightOJ 1009 二分图染色+BFS/种类并查集
题意:有两个阵营的人,他们互相敌对,给出互相敌对的人,问同个阵营的人最多有多少个. 思路:可以使用种类并查集写.也可以使用使用二分图染色的写法,由于给定的点并不是连续的,所以排序离散化一下,再进行BF ...
- Back to Underworld(搜索)
Back to Underworld Time Limit:4000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Su ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 1009: [HNOI2008]GT考试
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- LightOj 1298 - One Theorem, One Year(DP + 欧拉)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...
- 1214 - Large Division -- LightOj(大数取余)
http://lightoj.com/volume_showproblem.php?problem=1214 这就是一道简单的大数取余. 还想还用到了同余定理: 所谓的同余,顾名思义,就是许多的数被一 ...
- LightOJ Beginners Problems 部分题解
相关代码请戳 https://coding.net/u/tiny656/p/LightOJ/git 1006 Hex-a-bonacci. 用数组模拟记录结果,注意取模 1008 Fibsieve's ...
随机推荐
- 疯了吧!这帮人居然用 Go 写“前端”?(二)
作者 | 郑嘉涛(羣青) 来源|尔达 Erda 公众号 前言 上篇我们讲了故事发生的背景,也简单阐述了组件及协议的设想: 一.丰富的通用组件库. 二.组件渲染能力,将业务组件渲染成通用组件 ...
- Fragment放置后台很久(Home键退出很长时间),返回时出现Fragment重叠解决方案
后来在google查到相关资料,原因是:当Fragment长久不使用,系统进行回收,FragmentActivity调用onSaveInstanceState保存Fragment对象.很长时间后,再次 ...
- 基本类型、引用类型NPE异常
1.null是Java中的关键字,像public.static.final.它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错. 2.就像每种原始类型都有默认值一样 ...
- 监控网站是否异常的shell脚本
本节内容:shell脚本监控网站是否异常,如有异常就自动发邮件通知管理员. 脚本检测流程,如下:1,检查网站返回的http_code是否等于200,如不是200视为异常.2,检查网站的访问时间,超过M ...
- 【Vulfocus解题系列】手把手教你使用Vulfocus公开靶场对Apache Log4j2远程命令执行漏洞复现
前言 关于这个漏洞,啥都不用说了,直接发车. 工具下载 JNDIExploit:https://github.com/0x727/JNDIExploit 复现过程 启动靶场环境 直接用vulfocus ...
- Notepad++ 常用功能:批量取消替换换行、强制刷新数据
批量取消替换换行 换行批量替换成空格 Ctrl+F 打开查找替换窗口,使用:\r\n 替换成 空格,全部替换 强制刷新数据源,重新加载数据 快捷键:Ctrl+R 或者 Alt+F 然后 L 或者点击菜 ...
- 项目的基本概念(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 我一看到这个标题就头疼,好吧,又是概念,好在我不要参加相关的考试,否则文字连同标点符号都得背%¥#%#~ 张同学说,项目& ...
- JavaFx Tooltip悬浮提示使用及自定义
原文:JavaFx Tooltip悬浮提示使用及自定义 | Stars-One的杂货小窝 本篇是基于TornadoFx框架对Tooltip组件进行讲解,使用Kotlin语言,和传统Java使用有所区别 ...
- Kubernetes-API Server
前言 本篇是Kubernetes第十四篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kubern ...
- LuoguP1785 漂亮的绝杀 题解
Content 因太占排版,请自己去题面查看. Solution 声明:以下和题面相同的变量的意义均和题面相同. 这个题目 \(\texttt{if}\) 操作很多,其他的就是纯模拟. 首先,我们先判 ...