1009 - Back to Underworld
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.


PROBLEM SETTER: JANE ALAM JAN

思路:并查集;

我们要把上面的点分成两个阵营,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)的更多相关文章

  1. Lightoj 1009 - Back to Underworld

    1009 - Back to Underworld    PDF (English) Statistics Forum Time Limit: 4 second(s) Memory Limit: 32 ...

  2. LightOJ 1009 二分图染色+BFS/种类并查集

    题意:有两个阵营的人,他们互相敌对,给出互相敌对的人,问同个阵营的人最多有多少个. 思路:可以使用种类并查集写.也可以使用使用二分图染色的写法,由于给定的点并不是连续的,所以排序离散化一下,再进行BF ...

  3. Back to Underworld(搜索)

    Back to Underworld Time Limit:4000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Su ...

  4. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. 1009: [HNOI2008]GT考试

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...

  6. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  7. LightOj 1298 - One Theorem, One Year(DP + 欧拉)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...

  8. 1214 - Large Division -- LightOj(大数取余)

    http://lightoj.com/volume_showproblem.php?problem=1214 这就是一道简单的大数取余. 还想还用到了同余定理: 所谓的同余,顾名思义,就是许多的数被一 ...

  9. LightOJ Beginners Problems 部分题解

    相关代码请戳 https://coding.net/u/tiny656/p/LightOJ/git 1006 Hex-a-bonacci. 用数组模拟记录结果,注意取模 1008 Fibsieve's ...

随机推荐

  1. kubernetes部署 kube-apiserver服务

    kubernetes部署 kube-apiserver 组件 本文档讲解使用 keepalived 和 haproxy 部署一个 3 节点高可用 master 集群的步骤. kube-apiserve ...

  2. python第三天 列表和元组

    枚举 for in enumerate 循环输出字符串的内容并且输出它的索引信息: #判断索引为5的字符串是不是"您" is in Python提供了⼤量的内置数据结构,包含了列表 ...

  3. hbase调优

    @ 目录 一.phoenix调优 1.建立索引超时,查询超时 2.预分区 hbase shell预分区 phoenix预分区 3.在创建表的时候指定salting. 4.二级索引 建立行键与列值的映射 ...

  4. C语言中的字符和整数之间的转换

    首先对照ascal表,查找字符和整数之间的规律: ascall 控制字符  48  0  49  1  50  2  51  3  52  4  53  5  54  6  55  7  56  8 ...

  5. GISer如何突破二次开发瓶颈

    年初时写的<一个GISer的使命>那篇文章中,提出了GISer的技术提升路径可以分为四个大的阶段: 阶段一,能使用商业GIS软件去解决问题. 阶段二,能使用开源GIS软件去解决问题. 阶段 ...

  6. Java日期格式转换不用发愁

    前言 Java 中日期.时间相关的类相当的多,并且分不同的版本提供了不同的实现,包括 Date . Calendar . LocalDateTime . ZoneDateTime . OffsetDa ...

  7. 日常Java 2021/9/28

    字符串反转 package m; public class m { public static void main(String[] args) { //定义一个字符串 String str = &q ...

  8. 零基础学习java------25--------jdbc

    jdbc开发步骤图 以下要用到的products表 一. JDBC简介 补充    JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商趋势线这个接口,提 ...

  9. Angular中怎样创建service服务来实现组件之间调用公共方法

    Angular组件之间不能互相调用方法,但是可以通过创建服务来实现公共方法的调用. 实现 创建服务命令 ng g service 服务路径/服务名 比如这里在app/services目录下创建stor ...

  10. 学习Vue源码前的几项必要储备(二)

    7项重要储备 Flow 基本语法 发布/订阅模式 ES6+ 语法 原型链.闭包 函数柯里化 event loop 接上讲 聊到了ES6的几个重要语法,加下来到第四点继续开始. 4.原型链.闭包 原型链 ...