网络流0pt求助
查看原帖
网络流0pt求助
639198
Steve_xh楼主2024/10/8 15:59
#include<bits/stdc++.h>
#define toi (e[i].to)
#define tow (e[i].w)
#define row (e[i^1].w)
#define fore(now,i,arr) for(int i=arr[now];~i;i=e[i].next)
#define inf (0x3f3f3f3f)
using namespace std;
int n,cnt,head[505],s,t,ans,dp[505],cur[505];
bool vis[505];
struct EDGE{
    int to,next,w;
}e[50005];
inline void init(){
    memset(e,-1,sizeof(e));
    memset(head,-1,sizeof(head));
    ans=0;cnt=-1;
}
inline void addedge(int u,int v){
    e[++cnt].to=v;
    e[cnt].w=1;
    e[cnt].next=head[u];
    head[u]=cnt;

    e[++cnt].to=u;
    e[cnt].w=0;
    e[cnt].next=head[v];
    head[v]=cnt;
}
bool bfs(){
    for(int i=0;i<505;i++)
        cur[i]=head[i],dp[i]=inf,vis[i]=false;
    queue<int> q;
    q.push(s);
    dp[s]=0;
    while(!q.empty()){
        int now=q.front();
        q.pop();
        if(now==t)
            return true;
        fore(now,i,head)
            if(tow&&!dp[toi]){
                q.push(toi);
                dp[toi]=dp[now]+1;
            }
    }
    return false;
}
int dfs(int now,int f){
    if(now==t){
        ans+=f;
        return f;
    }
    int used=0;
    fore(now,i,cur){
        cur[now]=i;
        if(!tow||dp[toi]!=dp[now]+1)
            continue;
        int k=dfs(toi,min(tow,f-used));
        if(k){
            used+=k;
            tow-=k;
            row+=k;
            if(used==f)
                break;
        }
    }
    return used;
}
void Dinic(){
    while(bfs())
    // {
        dfs(s,inf);
        // cerr<<"end while\n";}
}
int T;
void solve(){
    init();
    cin>>n;
    s=n*2+1,t=s+1;
    for(int i=1;i<=n;i++)
        addedge(s,i),addedge(i+n,t);
    for(int i=1,k;i<=n;i++)
        for(int j=1;j<=n;j++){
            cin>>k;
            if(k)
                addedge(i,j+n);
        }
    Dinic();
    cout<<(ans==n?"Yes":"No")<<'\n';
}
int main(){
    cin>>T;
    while(T--)
        solve();
    return 0;
}
2024/10/8 15:59
加载中...