2023 CCPC 华为云计算挑战赛 hdu7399 博弈,启动!(图上博弈/枚举+逆向有向图sg函数)

news/2024/7/15 18:30:45 标签: 图论, 有向图, sg函数

题目

给定t(t<=200)组样例,

每次给定一个n(n<=300)个左边的点m(m<=300)个右边的点的二分图,图无重边

所有边总量不超过5e5

初始时棋子可以被放置在任意一个点上,

若被放置在左边,则Alice先走;被放置在右边,则Bob先走

每次可以选择一个当前点有出边的点,走到那个点上,如果当前点没有出边,则游戏结束

Alice想访问所有点无数次,Bob想阻止Alice这么做,双方均采取最优策略

问Alice是否有必胜策略(Alice可以指定起点在哪里)

思路来源

heltion+蔡老师

题解

问题等价于,

只要Bob能找到一个点,使Alice不能无限次经过,则Bob胜,否则Alice胜

称这样的点为防御点

n=300,所以考虑枚举防御点

对于枚举的防御点,先判断一下可达性,如果有点到不了防御点,则Alice全局必败

防御点是一个终态点,如果Alice不能到防御点,则Bob不能去指向防御点的点,以此类推…

已知终态不知起始态,其实与期望dp类似,启发我们建反图后从防御点拓扑排序
 

然后考虑类似拓扑排序的更新流程,实际就是sg函数的思想,

初始时,将防御点放入队列,

对二分图上的点,每个点计算一个dp值,

如果防御点位于左侧,则Alice到这个点就视为(在只考虑这个防御点时)获胜,置dp值为1

如果防御点位于右侧,则Bob到这个点就视为失败,置dp置为0

如果一个点的所有下游(反图的上游)都是对方的必胜点,则这个点是必败点

如果一个点的所有下游(反图的上游)存在对方的必败点,则这个点是必胜点

如果一个点确定了必胜/必败态,就将这个点放入队列,直至更新完所有点

跑完这一轮后,Alice必败&Bob必胜的起点需要被排除

此时,有一些点可能是没被更新过的,即拓扑排序中的环,

这些点的特性是:

1. 不存在下游是对方的必败点

2. 存在一部分下游点是对方的必胜点,

3. 另一部分下游是状态未确定的点

那如果Alice和Bob在这些点上玩的话,都只会走向状态未确定的点,使Alice永远走不到防御点

所以这些状态未确定的点,也需要被过滤排除

枚举完一个防御点就会过滤掉一些点,

枚举完所有点后,没被过滤掉的点,就是Alice的必胜起点,若不存在则Bob必胜

其实感觉是很典的拓扑图上sg问题

代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<ll,ll> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=605;
int T,n,m,u,v,k,c,dp[N],deg[N],d[N];
bool no[N],can[N];
vector<int>e[N];
void add(int u,int v){
	e[v].pb(u);
	deg[u]++;
}
bool L(int x){
	return x<n;
}
bool sol(int s){
	memset(dp,-1,sizeof dp);
	for(int i=0;i<n+m;++i)can[i]=0,d[i]=deg[i];
	queue<int>q;
	q.push(s);
	dp[s]=L(s);//点s表示GG想走到这里YY不想走到这里,位于左侧GG赢,位于右侧YY输
	can[s]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(auto &v:e[u]){
			can[v]=1;
			--d[v];
			if(~dp[v])continue;
			if(dp[u]==0)dp[v]=1;
			if(dp[u]==1 && !d[v])dp[v]=0;
			if(~dp[v])q.push(v);
		}
	}
	for(int i=0;i<n+m;++i){
		if(!can[i])return 0;
		if(L(i) && dp[i]==0)no[i]=1;
		if(!L(i) && dp[i]==1)no[i]=1;
		if(dp[i]==-1)no[i]=1;
	}
	return 1;
}
bool solve(){
	for(int i=0;i<n+m;++i){
		if(!deg[i])return 0;
	}
	memset(no,0,sizeof no);
	for(int i=0;i<n+m;++i){
		if(!sol(i))return 0;
	}
	for(int i=0;i<n+m;++i){
		if(!no[i])return 1;
	}
	return 0;
}
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		for(int i=0;i<n+m;++i){
			e[i].clear();
			deg[i]=0;
		}
		for(int i=0;i<n;++i){
			scanf("%d",&k);
			for(int j=1;j<=k;++j){
				scanf("%d",&v);
				add(i,n+v);
			}
		}
		for(int i=0;i<m;++i){
			scanf("%d",&k);
			for(int j=1;j<=k;++j){
				scanf("%d",&v);
				add(n+i,v);
			}
		}
		puts(solve()?"Yes":"No");
	}
	return 0;
}


http://www.niftyadmin.cn/n/4955381.html

相关文章

基于Pytorch实现的声纹识别系统

前言 本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM等多种先进的声纹识别模型&#xff0c;不排除以后会支持更多模型&#xff0c;同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法&#xff0c;使用了ArcFace Loss&#xff0c;ArcFace loss…

ARM 配置晶振频率

文章目录 前言串口乱码问题定位内核修改晶振频率uboot 修改晶振频率番外篇 前言 上篇文章《ARM DIY 硬件调试》介绍了 DIY ARM 板的基础硬件焊接&#xff0c;包括电源、SOC、SD 卡座等&#xff0c;板子已经可以跑起来了。 但是发现串口乱码&#xff0c;今天就来解决串口乱码问…

DPDK系列之二十七DIDO

一、DIDO介绍 随着计算机技术发展&#xff0c;特别是应用技术的快速发展。应用场景对计算机的处理速度几乎已经到了疯狂的地步。说句大白话&#xff0c;再快的CPU也嫌慢。没办法&#xff0c;CPU和IO等技术基本目前都处在了瓶颈之处&#xff0c;大幅度提高&#xff0c;短时间内…

Win11游戏高性能模式怎么开

1、点击桌面任务栏上的“开始”图标&#xff0c;在打开的应用中&#xff0c;点击“设置”&#xff1b; 2、“设置”窗口&#xff0c;左侧找到“游戏”选项&#xff0c;在右侧的选项中&#xff0c;找到并点击打开“游戏模式”&#xff1b; 3、打开的“游戏模式”中&#xff0c;找…

[linux kernel]semaphore信号量的用法

struct semaphore { raw_spinlock_t lock; --->锁 unsigned int count;--->信号量计数 struct list_head wait_list;--->信号量等待链表 }; struct semaphore_waiter { struct list_head list; struct task_struct *task; …

AI引擎助力,CamScanner智能高清滤镜开启扫描新纪元!

文章目录 ⭐ 写在前面⭐ 突破图像处理难点&#xff1a;扫描全能王的独特优势⭐ 耳听为虚&#xff0c;眼见为实⭐ 产品背后的主要核心&#xff1a;AI-Scan助力⭐ 深度学习助力智能文档处理的国际化进程⭐ 品味智能文档处理的轻松与精准 ⭐ 写在前面 在数字化快速发展的今天&…

最新ChatGPT网站程序源码+AI系统+详细图文搭建教程/支持GPT4.0/AI绘画/H5端/Prompt知识库

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…

春秋云镜 CVE-2019-9042

春秋云镜 CVE-2019-9042 Sitemagic CMS v4.4 任意文件上传漏洞 靶标介绍 Sitemagic CMS v4.4 index.php?SMExtSMFiles 存在任意文件上传漏洞&#xff0c;攻击者可上传恶意代码执行系统命令。 启动场景 漏洞利用 login进入登陆界面admin/admin 访问http://eci-2zebi1tekpr…