社区讨论

二分图匈牙利 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 条回复,欢迎继续交流。

正在加载回复...