• 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;
    }
    

      

    自己还是太辣鸡了
  • 相关阅读:
    HTTP协议(三)之缓存
    第三方开源库MBProgressHUD的功能扩展
    CocoaPods pod install/pod update更新慢的问题
    项目总结Version 1.0(三)
    项目总结Version 1.0(二)
    iOS内存管理nonatomic,assign,copy,retain
    Mac升级到Yosemite后默认的php版本不支持imagetfftext函数问题解决
    3333333333333333
    11111111111111111111
    ssssssssssssssss
  • 原文地址:https://www.cnblogs.com/zzyer/p/8503712.html
Copyright © 2020-2023  润新知