`
Simone_chou
  • 浏览: 197213 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Back to Underworld(带权并查集)

 
阅读更多
A - Back to Underworld
Crawling in process... Crawling failed Time Limit:4000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu
Submit Status Practice LightOJ 1009

Description

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

2

2

1 2

2 3

3

1 2

2 3

4 2

Sample Output

Case 1: 2

Case 2: 3

     题意:

     有T(1到10)个case,每个case开头包含一个N(1到100000),说明给出N条信息。每条信息包含A和B,说明A和B属于不同一队的人,至于是哪一队的人是不确定的,根据给出的所有信息,求出人数最大值

的一队人数。

    

     思路:

     首先要弄清楚这个最大值指的是什么。

     比如给出

     1 2

     2 3

     那么很自然的就知道1和3是一个队的,2是一个队的,那么最大人数就是2;

     还比如给出

     1 2

     2 3

     4 5

     5 6

     5 7

     那么可以归纳出,1和3一队,2一队;4,6,7一队,5一队;这时候一共有四队人数出来,但是总共只能有两队的人数,题意要求使人数最大,那么将1,3,4,6,7归结为一队,2和5归结为一队,那么最大人数就为5了。

     所以,这道题给出的信息并一定确保只有两个集合的,所以不能单纯的只用同不同一个根节点来判断人数大小,一开始理解的时候就发现了这个问题。

     可以用带权并查集来做,每给出一条信息就代表A和B是不同队的人,那么用0表示同一队,用1表示不同队。互相有关联的人会结在同一棵树上,(比如上面给出的例子二,1,2,3会在一颗树上,4,6,7,5会在另外一颗树上)一棵树上包含有两队人,通过判断子节点与根节点R的0,1关系来判断是敌人还是朋友,统计子节点与根节点R是1的数量(也就是敌人的数量)保存于nfri数组中,同时合并的时候用num数组来记录每个根节点一下包含一共有多少个子节点。那么这个根节点R下的敌人数为fri[R],队友数为num[R]-fri[R]。要使人数最多,那么遍历所有root[R]==R时候的根节点,ans+=max(fri[R],num[R]-fri[R])。求出的ans即为所求。

 

    AC:

 

#include<stdio.h>
#define max 20000+5
int root[max],num[max],re[max],nfri[max],vis[max];
//root记录根节点,num记录总数,re记录0,1关系
//nfri记录敌人数,vis记录这个人是否出现过
int find(int a)
{
	if(root[a]==a) return a;
	int r=find(root[a]);
	re[a]=(re[a]+re[root[a]])%2;
	root[a]=r;
	return r;
}

int main()
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		int n,ans=0;
		scanf("%d",&n);
		for(int j=1;j<max;j++)
		{  
		  root[j]=j;
		  num[j]=1;
		  re[j]=0;
		  nfri[j]=0;
		  vis[j]=0;
	        }
		while(n--)
		{
			int a,b;
			int fa,fb;
			scanf("%d%d",&a,&b);
			fa=find(a);
			fb=find(b);
			if(fa!=fb)
			{
				root[fa]=fb;
				num[fb]+=num[fa];
//统计该父节点下的总人数
				re[fa]=(re[b]+1-re[a])%2;
			}
			vis[a]=1;
			vis[b]=1;
		}
		
		for(int j=1;j<max;j++)
		{
			if(vis[j])
//如果这个人出现过
			{
				int fj=find(j);
//找到这个人的父节点
//因为find函数已经路径压缩了,这时候j直接指向fj
//那么re[j]就已经是代表j和fj的关系了
				if(re[j]) nfri[fj]++;
//如果re[j]==1,说明它与根节点为敌人关系,所以这个根节点的敌人人数增加1
			}
		}
//统计敌人数
		for(int j=1;j<max;j++)
		{
			if(vis[j]&&j==root[j])
			{
				ans+=((nfri[j]>num[j]-nfri[j])?nfri[j]:num[j]-nfri[j]);
			}
		}
//求最大值
		printf("Case %d: %d\n",i,ans);
	}
	return 0;
}

    总结:

    也想到有多集合的情况,但是没想到要按和最大来匹配人数。

分享到:
评论

相关推荐

    Underworld 2 Revival-开源

    《Underworld 2 Revival-开源》项目是一个致力于在WIN32系统上重现经典游戏《Underworld 2》的开源工程。与以往的《黑夜历险记》和《系统震撼骇客项目》不同,它的目标并非简单地进行1:1复刻,而是旨在通过现代技术...

    Underworld Online Game-开源

    Underworld是一款基于Web技术的大型多人在线角色扮演游戏(MMORPG),因此可以在任何Web浏览器上进行游戏。 这是一款幻想游戏,其中玩家可以是人类,也可以是怪物:战斗,咒语,购买/出售物品

    Unforgiving Underworld-开源

    《Unforgiving Underworld:一个开源的Roguelike游戏项目》 Unforgiving Underworld是一款深受Roguelike游戏风格影响的项目,它以独特的挑战性和随机性为特点,为玩家提供了一种深入地牢的冒险体验。作为一款开源...

    Underworld Adventures-开源

    在信息技术的广阔领域中,开源软件一直扮演着重要的角色,它推动了技术创新,激发了社区合作,并为开发者提供了无尽的学习资源。标题中的"Underworld Adventures-开源"正是这样一个项目,它旨在将经典的Ultima ...

    3DUNDERWORLD-SLSv2.1 双目格雷码3D重建源码

    3DUNDERWORLD-SLSv2.1正是基于这种原理,通过匹配左右图像中的对应特征,构建深度图并进行3D重建。 2. 格雷码编码:格雷码是一种无权值的二进制代码,相邻两位只有一位不同。在3D结构光重建中,格雷码用于编码投影...

    UnderworldExporterAssets:Underworld Exporter 的资产定义文件

    Underworld Exporter是一款强大的工具,主要用于游戏开发和三维场景的导出。这款工具的主要功能是将游戏或虚拟环境中的各种元素,如模型、纹理、动画等,导出为不同的格式,以便于在其他软件中进行编辑、渲染或者...

    Ultima Underworld Remake-开源

    《地狱传说》(Ultima Underworld)是一款历史悠久的电子角色扮演游戏,以其丰富的剧情、创新的玩法和探索元素在游戏史上留下了深刻的印记。"Ultima Underworld Remake" 是一个致力于将这款经典游戏重制到现代的技术...

    UWGeodynamics:黑社会的地球动力学

    但是,用户可以在模型设计的任何步骤轻松破坏高级对象并返回到地下世界的核心功能。 UWGeodynamics的灵感来自于Luke Mondy,Guillaume Duclaux和Patrice Rey为地下世界1开发的 。 流变库也取自LMR。 由于我们认为...

    underworld:黑夜传说是一款不和谐的机器人,目标是创建一个基于胜利的奖励系统和等级的聊天战斗环境

    UNDERWORLD-DISCORD BOT 使用NODE.JS和DISCORD.JS构建的DISCORD应用程序的聊天程序 该机器人正在开发中,测试版将很快发布特征 前缀为+但在首次部署时可以为System 。指令帮助该命令向您显示有关该机器人的简要信息...

    低模可爱平台障碍场景:Platformer 2 - Low Poly 1.4

    我们的目标是改进这个包,增加新的资源,并不断增强其内容。 包装内容 3个预先设计的游戏关卡,您可以在图片中查看。 181型号: 平台(x64) 平台、充气滑梯、拱门、桥梁、管子、水 交互(x16) 钥匙、浆果、...

    Flyweight-In-UnderWorld:这是Flyweight,策略和单例模式的简单实现,可最大程度地减少内存使用并优化项目中的游戏玩法

    飞跃地下世界 输出: 开始游戏... !!敌人转!!! 用电攻击。 电压:10.000 玩家受到了伤害,剩余生命:90.0 !!!!!!! 座头鲸鱼受到伤害,剩余生命:80.0 !... 流程结束,退出代码为0

    Geodynamics:科普文章和新闻网站

    Geodynamics:科普文章和新闻网站

    GW-April

    使用Visual Studio打开GW-April.sln,接受工具集升级并编译。 文件April.vcxproj.filters已被有意删除。 确保选中“显示所有文件”选项以在Visual Studio中查看目录结构。 贡献 非常欢迎以想法,批评和在GitHub上的...

    scitools

    例如,如果你有一个地球物理数据集,并且想要使用 Python 的 Underworlds 模拟地壳运动,你可以在 R 中这样操作: ```R library(reticulate) use_python("/path/to/your/python") py_module_install("scitools") #...

    SacredUtils:用于带有材料设计的“圣域”和“圣域”的配置实用程序。 被遗弃的05072020

    游戏Sacred and Sacred Underworld的许多有用和非常有用的设置。 定制的灵活性,您可以在SacredUtils中进行很多更改! 不断的支持和更新,错误修复,对游戏的帮助。 方便的设置管理和快速的工作。 从神圣1.0到...

    Abysmal Engine-开源

    Abysmal是一个旨在为System Shock 1和Ultima Underworld重新创建引擎的项目,该引擎可以使用原始数据文件运行这些游戏。

    基英授课计划2004级05-06(2).docx

    通过上述内容可以看出,该课程旨在通过不同单元的教学,提高学生的英语听说读写能力,并结合实际案例进行深入讨论和练习。每单元的内容涵盖了多种语言技能训练,如口语表达、写作技巧等,旨在全面提升学生的英语综合...

    compound-word

    复合词将复合词分成几部分。 使用30万个最常用的单词。 const parse = require ( 'compound-word' )let parts = parse ( 'facebook' ) // =&gt; ['face', 'book']parse ( 'underworld' )// =&gt; ['under', 'world']

    B树的C++源代码及测试代码

    Underworld&quot; 1 0} {&quot;bac&quot; &quot;Samantha&quot; 1 2} {&quot;cass&quot; &quot;Gelka&quot; 1 3} {&quot;mark&quot; &quot;Clark&quot; 1 4} {&quot;gone&quot; &quot;Woolfy&quot; 1 5} {&quot;...

    B树的C++实现

    struct tree_data tr[101] = {{"asd", "4Hero", 1, 1}, {"abc", "Underworld", 1, 0}, {"bac", "Samantha", 1, 2}, {"cass", "Gelka", 1, 3}, {"mark", "Clark", 1, 4}, {"gone", "Woolfy", 1, 5}, {"word", ...

Global site tag (gtag.js) - Google Analytics