车的放置
作者:互联网
给定带有禁止位置n*n棋盘最多能放多少个车
1元素: 每行只能放一个车 这个车的行列号是唯一的
0元素: 一个车不能同时在两个行
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=205;
int read()
{
int x=0,f=0,c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f?-x:x;
}
struct Edge
{
int to,next;
}e[N*N];
int head[N*2],cnt;
void _add(int a,int b){ e[++cnt]=(Edge){b,head[a]};head[a]=cnt;}
void add(int a,int b){ _add(a,b); _add(b,a);}
bool vis[N*2],mp[N][N];
int match[N*2],n,m,T;
bool dfs(int x)
{
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].to;
if(vis[y]) continue; vis[y]=1;
if( !match[y] ||dfs(match[y]) ) { match[x]=y; match[y]=x; return true;}
}
return false;
}
int main()
{
n=read(); m=read(); T=read();
for(int i=1;i<=T;i++)
{
int x=read(),y=read();
mp[x][y]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!mp[i][j]) add(i,j+n);
int ans=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof vis);
ans+=dfs(i);
}
printf("%d",ans);
return 0;
}
标签:&&,int,元素,while,放置,include,getchar 来源: https://www.cnblogs.com/juruoHBr/p/15880609.html