二分图匈牙利 T了两个点 吸氧也过不去

P3355 骑士共存问题

旅人杜 @ 2018-11-08 17:03:56

代码如下

#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;
}

by 天上一颗蛋 @ 2018-11-08 17:08:06

这题卡匈牙利


by 夕立 @ 2018-11-08 17:14:01

这题卡匈牙利poi


by TLE自动机 @ 2019-08-09 12:36:05

抱歉,DINIC跑二分图复杂度是n*min(m^{\frac{2}{3}},n^{\frac{1}{3}})的, 匈牙利上界要n^3 所以要卡的话完全可以出到5e3级别orz


|