社区讨论
二分图匈牙利 T了两个点 吸氧也过不去
P3355骑士共存问题参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi7csh28
- 此快照首次捕获于
- 2025/11/20 19:33 4 个月前
- 此快照最后确认于
- 2025/11/20 19:33 4 个月前
代码如下
CPP#include<cstdio>
#include<cstring>
using namespace std;
int ch[8][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,-1},{2,1},{-2,1},{-2,-1}};
struct node
{
int v;
int next;
}attack[400000];
int map[3000][3000],book[40005],match[40005],first[40005];
int n,m,cnt=1;
int dfs(int);
void add(int ,int);
int main()
{
scanf("%d%d",&n,&m);
int num=n*n-m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=0;
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
map[x][y]=1;
}
memset(first,-1,sizeof(first));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int t=map[i][j],q1,q2;
if(t==0)
{
for(int k=0;k<8;k++)
{
q1=i+ch[k][0];
q2=j+ch[k][1];
if(map[q1][q2]==0 and q1>=1 and q1<=n and q2>=1 and q2<=n)
add((i-1)*n+j,(q1-1)*n+q2);
}
}
}
int sum=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(map[i][j]==0)
{
memset(book,0,sizeof(book));
if(dfs((i-1)*n+j))
sum++;
}
printf("%d\n",num-sum/2);
return 0;
}
void add(int u,int v)
{
attack[cnt].v=v;
attack[cnt].next=first[u];
first[u]=cnt;
cnt++;
}
int dfs(int u)
{
for(int i=first[u];i!=-1;i=attack[i].next)
{
int w=attack[i].v;
if(book[w]==0)
{
book[w]=1;
if(match[w]==0 or dfs(match[w]))
{
match[w]=u;
return 1;
}
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...