思路和Asteroids那题一样,把黑块的横行向纵行连边后跑二分图最小点覆盖,用的是Dinic
如果最小点覆盖为 n 那么就说明存在 n 个黑块互相不同行且不同列,就是有解的
请问这个思路错在哪里(
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;
}