AcWing P379 捉迷藏 题解
2024-08-27 05:49:33
Analysis
这道题因为我们要给能到达的两个点都连上,又由于n<=200,所以我们可以用n³的传递闭包来建边,再用匈牙利算法来求二分图最大点独立集。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 210
#define maxm 30010
using namespace std;
inline int read()
{
int x=;
bool f=;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=;
for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
if(f) return x;
return -x;
}
inline void write(int x)
{
if(x<){putchar('-');x=-x;}
if(x>)write(x/);
putchar(x%+'');
}
int n,m,ans,match[maxm],cnt,tc[maxn][maxn];
bool book[maxm];
inline bool dfs(int u)
{
for(int i=;i<=n;i++)
{
if(tc[u][i]==)
{
if(!book[i])
{
book[i]=;
if(!match[i]||dfs(match[i]))
{
match[i]=u;
return true;
}
}
} }
return false;
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{
int x,y;
x=read();y=read();
tc[x][y]=;
}
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j&&tc[i][j]==)
{
tc[i][j]=tc[i][j]||(tc[i][k]&&tc[k][j]);
}
for(int i=;i<=n;i++)
{
memset(book,,sizeof(book));
if(dfs(i))ans++;
}
write(n-ans);
return ;
}
请各位大佬斧正(反正我不认识斧正是什么意思)
最新文章
- windows charles response 乱码解决办法
- helios架构详解(一)服务器端架构
- java中的注解(Annotation)
- Codeforces Round #202 (Div. 2) A,B
- php截取字符串的实例代码(支持utf-8)
- soliworks三维机柜布局(二)创建设备位置
- 添加标签2 jquery 和JS
- YII 主题
- 细聊 Cocoapods 与 Xcode 工程配置
- 解决animate动画连续播放bug
- QTabWidget and QTabBar.的文字的颜色设置,三种方法
- ASP.NET中的C#基础知识
- 【Android Developers Training】 83. 实现高效网络访问来优化下载
- [题解] 2038: [2009国家集训队]小Z的袜子(hose)
- JSOI2018 简要题解
- 属性复制方法,当属性名字不一致时候可以传入匹配的Map
- c#接口与抽象类的区别(一)
- Attacks for RL
- 设计模式之UML类图六大关系辨析【2】
- centos7 安装步骤