刚学OI,沬子求助网络流
查看原帖
刚学OI,沬子求助网络流
538609
Neutralized楼主2022/4/23 10:04

思路和Asteroids那题一样,把黑块的横行向纵行连边后跑二分图最小点覆盖,用的是Dinic
如果最小点覆盖为 nn 那么就说明存在 nn 个黑块互相不同行且不同列,就是有解的
请问这个思路错在哪里(
WA 20pts

#include <iostream>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <vector>
using namespace std;

#define ll long long
#define ri register int
inline void apricity(){ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL);}

#define N 80001
#define pos(x,y) ((x-1)*n+y)
int n,cntb,col[N],S,T;

int head[N],cntr(1);
struct net_edge{
    int to,nxt,flow;
}e[N<<4];
inline void net_add(int u,int v,int w){
    e[++cntr]={v,head[u],w};
    head[u]=cntr;
    e[++cntr]={u,head[v],0};
    head[v]=cntr;
}
#define gfore(u) for(ri i=head[u];i;i=e[i].nxt)

const int oo=2147483600;
struct Queue{
    vector<int> q; int lef,rig;
    Queue(){q.resize(2),lef=1,rig=0;}
    Queue(int siz){q.resize(siz),lef=1,rig=0;}
    inline void resiz(int x){q.resize(x),lef=1,rig=0;}
    inline void clear(){q.clear(),q.resize(2),lef=1,rig=0;}
    inline void push(int x){
        if(rig>=q.size()-1) q.push_back(x),++rig;
        else q[++rig]=x;
    }
    inline int front(){return q[lef];}
    inline void pop_front(){++lef;}
    inline int get_front(){++lef;return q[lef-1];}
    inline void pop_back(){--rig;}
    inline int len(){return rig-lef+1;}
    inline int size(){return q.size();}
    inline void out(char c=0){
    	for(int i=lef;i<=rig;++i)
    	cout<<q[i]<<' '; c&&cout<<c;
	}
}q; int dep[N],cur[N];
inline bool bfs(){
    fill(dep+1,dep+T+1,-1);
    q.clear(),q.push(S),cur[S]=head[S];
    while(q.len()){
        int u=q.get_front();
        gfore(u){ int &v=e[i].to;
            if(dep[v]==-1&&e[i].flow){
                dep[v]=dep[u]+1;
                if(v==T) return true;
                cur[v]=head[v],q.push(v);
            }
        }
    } return false;
}
inline int dfs(int u,int maxfl){
    if(u==T||!maxfl) return maxfl;
    int tflow=0;
    for(ri i=cur[u];i&&tflow<maxfl;cur[u]=i,i=e[i].nxt){
        int &v=e[i].to,&fl=e[i].flow;
        if(dep[v]==dep[u]+1&&fl){
            int tfl=dfs(v,min(maxfl-tflow,fl));
            if(!tfl) dep[v]=-1;
            else{
                fl-=tfl,e[i^1].flow+=tfl;
                tflow+=tfl;
            }
        }
    } return tflow;
}
inline void Dinic(){
    int res(0),delta;
    while(bfs())
        while(delta=dfs(S,+oo))
        res+=delta;
    cout<<(res==n?"Yes":"No")<<endl;
}

int main()
{
    int Tas; apricity(),cin>>Tas;
    while(Tas--){
        cntr=cntb=0;
        cin>>n,S=0,T=(n<<1)+1;
        fill(head,head+T+1,0);
        for(ri i=1;i<=n;++i){
            net_add(S,i,1),net_add(i+n,T,1);
            for(ri j=1;j<=n;++j){
                int p=pos(i,j);
                cin>>col[p];
                if(col[p])
                ++cntb,net_add(i,j+n,1);
            }
        } if(cntb<n){cout<<"No"<<endl;continue;}
        Dinic();
    }
    return 0;
}
2022/4/23 10:04
加载中...