其他分享
首页 > 其他分享> > 车的放置

车的放置

作者:互联网

给定带有禁止位置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