zoukankan      html  css  js  c++  java
  • BZOJ 1433 [ZJOI2009]假期的宿舍

    题解:二分图建模

    左边是人,右边是床

    s向需要在学校的人连边

    有床的人向t连边

    认识的人互相连边

    跑最大流与需要在学校的人数量是否相等比较、

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<vector>
    using namespace std;
    const int maxn=6000;
    const int oo=1000000000;
    
    int TT;
    int n;
    int isstu[100];
    int isgoh[100];
    
    struct Edge{
    	int from,to,cap,flow;
    };
    vector<int>G[maxn];
    vector<Edge>edges;
    void Addedge(int x,int y,int z){
    	Edge e;
    	e.from=x;e.to=y;e.cap=z;e.flow=0;
    	edges.push_back(e);
    	e.from=y;e.to=x;e.cap=0;e.flow=0;
    	edges.push_back(e);
    	int c=edges.size();
    	G[x].push_back(c-2);
    	G[y].push_back(c-1);
    }
    
    
    int s,t;
    queue<int>q;
    int vis[maxn];
    int d[maxn];
    int Bfs(){
    	memset(vis,0,sizeof(vis));
    	vis[s]=1;d[s]=0;q.push(s);
    	while(!q.empty()){
    		int x=q.front();q.pop();
    		for(int i=0;i<G[x].size();++i){
    			Edge e=edges[G[x][i]];
    			if((!vis[e.to])&&(e.cap>e.flow)){
    				vis[e.to]=1;
    				d[e.to]=d[x]+1;
    				q.push(e.to);
    			}
    		}
    	}
    	return vis[t];
    }
    
    int Dfs(int x,int a){
    	if((x==t)||(a==0))return a;
    	
    	int nowflow=0,f=0;
    	for(int i=0;i<G[x].size();++i){
    		Edge e=edges[G[x][i]];
    		if((d[x]+1==d[e.to])&&((f=Dfs(e.to,min(a,e.cap-e.flow)))>0)){
    			nowflow+=f;
    			a-=f;
    			edges[G[x][i]].flow+=f;
    			edges[G[x][i]^1].flow-=f;
    			if(a==0)break;
    		}
    	}
    	return nowflow;
    }
    
    int ma[100][100];
    
    int Maxflow(){
    	int flow=0;
    	while(Bfs())flow+=Dfs(s,oo);
    	return flow;
    }
    
    void Dinicinit(){
    	for(int i=0;i<=n+n+2;++i)G[i].clear();
    	edges.clear();
    }
    
    int main(){
    	scanf("%d",&TT);
    	while(TT--){
    		
    		scanf("%d",&n);
    		Dinicinit();
    		int cnt=0;
    		for(int i=1;i<=n;++i)scanf("%d",&isstu[i]);
    		for(int i=1;i<=n;++i)scanf("%d",&isgoh[i]);
    		//n+n
    		s=n+n+1;t=s+1;
    		for(int i=1;i<=n;++i){
    			for(int j=1;j<=n;++j){
    				scanf("%d",&ma[i][j]);
    			}
    		}
    		
    		for(int i=1;i<=n;++i){
    			if((isstu[i]&&!isgoh[i])||(!isstu[i])){
    				++cnt;
    				Addedge(s,i,1);
    			}
    		}
    		for(int i=1;i<=n;++i){
    			if(isstu[i])Addedge(i+n,t,1);
    		}
    		for(int i=1;i<=n;++i){
    			for(int j=1;j<=n;++j){
    				if(ma[i][j]){
    					Addedge(i,j+n,1);
    				}
    			}
    		}
    		for(int i=1;i<=n;++i)Addedge(i,i+n,1);
    		if(Maxflow()!=cnt)printf("T_T
    ");
    		else printf("^_^
    ");
    	}
    	return 0;
    }
    

      

    自己还是太辣鸡了
  • 相关阅读:
    【crontab】误删crontab及其恢复
    New Concept English there (7)
    New Concept English there (6)
    New Concept English there (5)
    New Concept English there (4)
    New Concept English there (3)
    New Concept English there (2)Typing speed exercise
    New Concept English there (1)Typing speed exercise
    New Concept English Two 34 game over
    New Concept English Two 33 94
  • 原文地址:https://www.cnblogs.com/zzyer/p/8503712.html
Copyright © 2011-2022 走看看