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. 【模板】二分图最大匹配(匈牙利算法)/洛谷P3386

    题目链接 https://www.luogu.com.cn/problem/P3386 题目大意 给定一个二分图,其左部点的个数为 \(n\),右部点的个数为 \(m\),边数为 \(e\),求其最大 ...

  2. JAVA中数组的基本概念与用法

    JAVA中数组的基本概念与用法 1. 数组的定义与特点 数组的一种引用数据类型 数组中可以同时存放多个数据,但是数据的类型必须统一 数组的长度在开始时就需要确定,在程序运行期间是不可改变的 虽然可以使 ...

  3. c/c++在线编译Output Limit Exceeded(OLE)错误

    提示输出错误,有如下两个可能情况: 1. 不符合题目给出的输出格式,自己输出了多余的内容或者格式不正确 2. 输入数据的时候,未考虑到输入错误的情况 针对2,有如下的例子: 错误的情况: 1 int ...

  4. android studio Please configure Android SDK / please select Android SDK

    有可能是sdk文件损坏造成的. file->settings->appearance&behavior->system settings->android sdk-&g ...

  5. Hadoop 相关知识点(一)

    作业提交流程(MR执行过程) Mapreduce2.x Client:用来提交作业 ResourceManager:协调集群上的计算资源的分配 NodeManager:负责启动和监控集群上的计算容器( ...

  6. 手淘lib-flexible布局适配方案

    前置知识:什么是rem CSS3新增的一个相对单位rem(root em,根em).rem是相对于根节点(或者是html节点).如果根节点设置了font-size:10px;那么font-size:1 ...

  7. oracle 执行计划的获取方法

    1.用explain plan for来获取执行计划 explain plan for <sql>; select * from table(dbms_xplan.display()); ...

  8. spring注解-bean生命周期

    https://www.jianshu.com/p/70b935f2b3fe bean的生命周期 bean创建---初始化----销毁的过程 容器管理bean的生命周期 对象创建:容器启动后调用bea ...

  9. linux系统的一些常用命令

    cd 进入某个目录 ifconfig 查看本机的ip cp (要复制的文件的位置) (要把文件复制的位置) ll 查看文件下,文件的操作权限 ls查看该文件夹下的有那些文件和文件夹 vi filena ...

  10. Hibernate的基本功能:对数据库的增删改查(创建对象实例)

    一.通过实例化的对象向数据库添加新记录 package com.yh.test; import org.hibernate.Session; import org.hibernate.SessionF ...