zoukankan      html  css  js  c++  java
  • BZOJ1433 [ZJOI2009]假期的宿舍 二分图匹配 匈牙利算法

    原文链接http://www.cnblogs.com/zhouzhendong/p/8372785.html


    题目传送门 - BZOJ1433


    题解

      我们理一理题目。

      在校的学生,有自己的床,还可以睡朋友的床。

      离校的学生,不占床。

      外来的学生,只能睡朋友的床。

      然后就是一个裸的二分图匹配了。


    代码

    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int N=55;
    int T,n,g[N][N],a[N],b[N];
    int match[N],vis[N];
    int Match(int x){
    	for (int i=1;i<=n;i++)
    		if (!vis[i]&&g[x][i]){
    			vis[i]=1;
    			if (!match[i]||Match(match[i])){
    				match[i]=x;
    				return 1;
    			}
    		}
    	return 0;
    }
    int hungray(){
    	memset(match,0,sizeof match);
    	for (int i=1;i<=n;i++)
    		if (!b[i]){
    			memset(vis,0,sizeof vis);
    			if (!Match(i))
    				return 0;
    		}
    	return 1;
    }
    int main(){
    	scanf("%d",&T);
    	while (T--){
    		scanf("%d",&n);
    		memset(g,0,sizeof g);
    		for (int i=1;i<=n;i++)
    			scanf("%d",&a[i]);
    		for (int i=1;i<=n;i++)
    			scanf("%d",&b[i]);
    		for (int i=1;i<=n;i++)
    			for (int j=1;j<=n;j++){
    				scanf("%d",&g[i][j]);
    				if (!a[j])
    					g[i][j]=0;
    			}
    		for (int i=1;i<=n;i++){
    			if (a[i])
    				g[i][i]=1;
    			else
    				b[i]=0;
    		}
    		puts(hungray()?"^_^":"T_T");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    frog-jump
    nth-digit
    binary-watch
    elimination-game
    evaluate-division
    random-pick-index
    integer-replacement
    rotate-function
    longest-substring-with-at-least-k-repeating-characters
    decode-string
  • 原文地址:https://www.cnblogs.com/zhouzhendong/p/BZOJ1433.html
Copyright © 2011-2022 走看看