BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模

Code:

// luogu-judger-enable-o2
#include <bits/stdc++.h>
#define maxn 400
#define inf 10000000 
#define setIO(s) freopen(s".in","r",stdin) 
#define r1(i) i 
#define r2(i) (i+n)
#define r3(i) (i+n+n) 
#define r4(i) (i+n+n+n) 
using namespace std;
char str[100];  
int G[maxn][maxn]; 
namespace Dinic{
    struct Edge{
        int from,to,cap; 
        Edge(int u=0,int v=0,int c=0):from(u),to(v),cap(c){} 
    }; 
    vector<int>G[maxn]; 
    vector<Edge>edges; 
    queue<int>Q; 
    int vis[maxn],d[maxn],curr[maxn]; 
    int s,t; 
    void addedge(int u,int v,int c){
        edges.push_back(Edge(u,v,c)),edges.push_back(Edge(v,u,0)); 
        int m=edges.size();
        G[u].push_back(m-2),G[v].push_back(m-1); 
    }
    int BFS(){
        memset(vis,0,sizeof(vis)); 
        d[s]=0,vis[s]=1, Q.push(s); 
        while(!Q.empty()){
            int u=Q.front();Q.pop(); 
            for(int sz=G[u].size(),i=0;i<sz;++i){
                Edge r=edges[G[u][i]]; 
                if(!vis[r.to]&&r.cap>0) {
                    vis[r.to]=1,d[r.to]=d[u]+1; 
                    Q.push(r.to); 
                }
            }
        }
        return vis[t]; 
    }
    int dfs(int x,int cur){
        if(x==t) return cur;
        int f,flow=0;
        for(int sz=G[x].size(),i=curr[x];i<sz;++i){
            curr[x]=i; 
            Edge r=edges[G[x][i]]; 
            if(d[r.to]==d[x]+1&&r.cap>0){
                f=dfs(r.to,min(cur,r.cap)); 
                cur-=f,flow+=f,edges[G[x][i]].cap-=f,edges[G[x][i]^1].cap+=f; 
            }
            if(cur<=0) break; 
        }
        return flow; 
    }
    int maxflow(){
        int flow=0;
        while(BFS()) memset(curr,0,sizeof(curr)),flow+=dfs(s,inf); 
        return flow; 
    }
    void re(){
        for(int i=0;i<maxn;++i) G[i].clear(); 
        edges.clear(); 
    }
};   
int n,k; 
bool check(int t){
    Dinic::re();  
    Dinic::s=0,Dinic::t=396; 
    for(int i=1;i<=n;++i) {
        Dinic::addedge(r1(i),r2(i),k);
        Dinic::addedge(r3(i),r4(i),k); 
        Dinic::addedge(Dinic::s,r1(i),t);
        Dinic::addedge(r4(i),Dinic::t,t); 
        for(int j=1;j<=n;++j) {
            if(G[i][j]) 
                Dinic::addedge(r1(i),r4(j),1); 
            else
                Dinic::addedge(r2(i),r3(j),1);  
        }
    }
    return Dinic::maxflow()==t*n; 
}
int main(){
    // setIO("input"); 
    scanf("%d%d",&n,&k); 
    for(int i=1;i<=n;++i){
        scanf("%s",str+1); 
        for(int j=1;j<=n;++j) if(str[j]=='Y') G[i][j]=1; 
    } 
    int l=1,r=n,mid,ans=0; 
    while(l<=r){
        mid=(l+r)>>1;
        if(check(mid)) ans=mid,l=mid+1;
        else r=mid-1; 
    }
    printf("%d",ans); 
    return 0; 
}

  

猜你喜欢

转载自www.cnblogs.com/guangheli/p/10943672.html
今日推荐