EK不行吗?qwq

P3355 骑士共存问题

PrincessQi @ 2019-09-24 20:39:00

#include<bits/stdc++.h>
#define maxn 1000001
#define INF 119260817
using namespace std;
int cnt,c[maxn],fr[maxn],to[maxn],Next[maxn],head[maxn],dis[maxn],vis[maxn],f[maxn],l[maxn],mf,qwq[505][505],x[8]={1,1,-1,-1,2,2,-2,-2},y[8]={2,-2,2,-2,1,-1,1,-1},s,t,n,m; 
queue<int>q;
int arr(int x,int y){
    return (x-1)*n+y;
}
void add(int x,int y,int z){    
    cnt++;
    c[cnt]=z;
    fr[cnt]=x;
    to[cnt]=y;
    Next[cnt]=head[x];
    head[x]=cnt;
}
int bfs(int S,int T){          
    for(int i=0;i<=n*n+1;i++)
        l[i]=0,vis[i]=-1;
    q.push(S);
    dis[S]=0;
    vis[S]=1;
    f[S]=INF;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u];i!=-1;i=Next[i]){
            int v=to[i];
            if(c[i]&&vis[v]==-1){    
                f[v]=min(f[u],c[i]);   
                l[v]=i;               
                q.push(v);
                vis[v]=u;
            }
        }
    }if(vis[T]!=-1)return 1;          
    return 0;
}
void u(int S,int T){         
    int now=T;
    while(now!=S){
        int i=l[now];
        c[i]-=f[T];
        c[i^1]+=f[T];  
        now=fr[i];        
    }
    mf+=f[T];    
}
int main(){
    cnt=1;
    memset(head,-1,sizeof(head));
    scanf("%d%d",&n,&m);
    s=0;
    t=n*n+1;
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        qwq[x][y]=1;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(!qwq[i][j]){
                if((i+j)&1){
                    add(s,arr(i,j),1);
                    add(arr(i,j),s,0);
                }
                else
                    {
                    add(arr(i,j),t,1);
                    add(t,arr(i,j),0);
                }
            }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if(((i+j)&1)==0)continue;
            for(int k=0;k<8;k++){
                int tox=i+x[k],toy=j+y[k];
                if(tox>=1&&tox<=n&&toy>=1&&toy<=n&&!qwq[tox][toy]){
                    add(arr(i,j),arr(tox,toy),INF);
                    add(arr(tox,toy),arr(i,j),0);
                }
            }
        }
    mf=0;
    while(bfs(s,t)==1)
        u(s,t);
    printf("%d\n",n*n-m-mf);
    return 0;
}

by Zenith_Yeh @ 2019-09-24 20:40:26

@Dr冯 NB


by kradcigam @ 2019-09-24 20:40:59

@Dr冯 这也太暴力了吧


by 铃宕 @ 2019-09-24 20:41:58

dinic万岁


by PrincessQi @ 2019-09-24 20:42:13

@赵海鲲 qwq


by PrincessQi @ 2019-09-24 20:42:33

我不会dinic啊……


by kradcigam @ 2019-09-24 20:44:09

@Dr冯 大佬,您切紫题!


by Polaris_Dane @ 2019-09-24 20:46:48

@Dr冯

这种题本身都不是给EK跑的

二分图匹配本身就应该用Dinic

或者。。。

用HLPP(当时我是这么做的,因为我Dinic忘记优化了,T了)


by PrincessQi @ 2019-09-24 20:59:34

@赵海鲲 我不是打了一个半小时还没过吗qwq


by PrincessQi @ 2019-09-24 21:00:06

@Polaris_Dane 但我只会EK我太菜了


by Polaris_Dane @ 2019-09-24 21:00:56

@Dr冯

随便学学就会了


| 下一页