这题的构图其实很好像,但是我一开始构图的时候忘记把find函数的寻找范围修改了,WA了好久。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1200+5;
bool line[maxn][maxn],used[maxn];
int gril[maxn],map[maxn][maxn];
int k,m,n;
int cnt;
bool find(int x)
{
for(int j=1;j<=cnt;j++){//扫描每一个点
if(line[x][j]==true&&used[j]==false)//这里用的是邻接矩阵
{
used[j]=1;
if(gril[j]==-1||find(gril[j])){//如果还未匹配或者还能找到增广路,那就继续
gril[j]=x;
return true;
}
}
}
return false;
}
int main()
{
while(~scanf("%d%d%d",&m,&n,&k))
{
memset(line,false,sizeof(line));
memset(gril,-1,sizeof(gril));
memset(map,0,sizeof(map));
for(int i=0;i<k;i++){
int u,v;
scanf("%d%d",&u,&v);
map[v][u]=-1;
}
cnt=0;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
if(map[i][j]==-1) continue;
map[i][j]=++cnt;
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
if(map[i][j]==-1) continue;
if(i-1>0&&map[i-1][j]!=-1) line[map[i][j]][map[i-1][j]]=true;
if(j-1>0&&map[i][j-1]!=-1) line[map[i][j]][map[i][j-1]]=true;
if(i+1<=m&&map[i+1][j]!=-1) line[map[i][j]][map[i+1][j]]=true;
if(j+1<=n&&map[i][j+1]!=-1) line[map[i][j]][map[i][j+1]]=true;
}
int ans=0;
for(int i=1;i<=cnt;i++)
{
memset(used,false,sizeof(used));
if(find(i)) ans+=1;
}
if(ans==m*n-k) printf("YES\n");
else printf("NO\n");
}
return 0;
}