标签:ch int read rg 放置 車的 CH6802 data 节点
6802 車的放置 0x60「图论」例题
描述
给定一个N行M列的棋盘,已知某些格子禁止放置。问棋盘上最多能放多少个不能互相攻击的車。車放在格子里,攻击范围与中国象棋的“車”一致。N,M≤200。
输入格式
第一行为n,m,t(表示有t个禁止的格子)
第二行到t+1行为x,y,分别表示禁止格子所在的位置,x为第x行,y为第y列,行列编号从1开始。
输出格式
一个整数,表示最多能放多少个車。
样例输入
8 8 0
样例输出
8
题解
把行、列看成节点
1要素:行节点、列节点只能放一个
0要素:行节点之间没有边,列节点之间也没有
所以建二分图跑最大匹配,时间复杂度\(O((n+m)nm)\)
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-') w=-w;
for(;isdigit(ch);ch=getchar()) data=data*10+ch-'0';
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
co int N=201;
int n,m,t,ans,fa[N];
bool a[N][N],v[N];
bool dfs(int x){
for(int y=1;y<=m;++y){
if(a[x][y]||v[y]) continue;
v[y]=1;
if(!fa[y]||dfs(fa[y])){
fa[y]=x;
return 1;
}
}
return 0;
}
int main(){
read(n),read(m),read(t);
while(t--) a[read<int>()][read<int>()]=1;
for(int i=1;i<=n;++i){
memset(v,0,sizeof v);
ans+=dfs(i);
}
printf("%d\n",ans);
return 0;
}
标签:ch,int,read,rg,放置,車的,CH6802,data,节点 来源: https://www.cnblogs.com/autoint/p/10971406.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。