【UOJ#26.】【IOI2014】Game 交互题,构造

本文介绍了一种基于图论的博弈论游戏算法,通过两种不同的实现方式确保游戏过程中小B玩家获胜的策略。讨论了如何在游戏的不同阶段询问边的存在性,并通过具体的代码实现了两种算法:一种基于并查集的O(n^2)复杂度算法和另一种更高效的O(n)复杂度算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
int main()
{
	puts("转载请注明出处");
	puts("地址:blog.youkuaiyun.com/vmurder/article/details/43699415");
}


先给UOJ打个广告。Orz Vfeaking~~~

#include <stdio.h>
int main()
{
	puts("UOJ网址:UOJ.ac");
	puts("本题地址:uoj.ac/problem/26");
}

题解:

两种,都是建立在一个前提下的,

就是一个点(或者点集),如果它的出边都问完了之前就可以知道它是否连通了

那么显然剩下的出边就没有必要问了。


然后这样这些边留到最后问就可以保证小B必胜了。

所以显然小A不能让这种情况发生。


两种方法:

1、 O(n^2) 

维护并查集以及两点集之间的度数,

然后最后一个度数的时候再输出yes并且将两个点集合并。

合并:将被父亲的那个点集到其它点集的度数继承到被儿子的那个点。


2. O(n)

一个点到其它点中最后一个点连边时才输出yes

也就是以下代码。


代码:

#include "game.h"
int cnt[1600];
void initialize(int n){}
int hasEdge(int u,int v)
{
	if(u<v)u=v;
	return ++cnt[u]==u;
	 // 不到最后一刻不告诉你
	//它跟其它(所有点)是否连同
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值