• 【bzoj1433】 ZJOI2009—假期的宿舍


    http://www.lydsy.com/JudgeOnline/problem.php?id=1433 (题目链接)

    题意

      一个暑假,有人去大学里面探望朋友,有些人回家了,有些人留下了,每个人都要在学校里面过夜。一个人只能睡他认识的人的床。问能否安排出方案使所有人有床睡。

    Solution

      直接按照题意连边然后二分图匹配即可。

    细节

      多组注意清空数组,以及自己睡自己床的情况。

    代码

    // bzoj1433
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    #include<queue>
    #define LL long long
    #define inf 2147483640
    #define Pi acos(-1.0)
    #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
    using namespace std;
    
    const int maxn=1010;
    int f[maxn][maxn],vis[maxn],p[maxn],a[maxn],b[maxn];
    int cnt,flag,n;
    
    void Init() {
    	cnt=0;flag=1;
    	memset(f,0,sizeof(f));
    	memset(p,0,sizeof(p));
    	memset(vis,0,sizeof(vis));
    }
    bool match(int x) {
    	for (int i=1;i<=n;i++) if (a[i] && f[x][i] && vis[i]!=cnt) {
    			vis[i]=cnt;
    			if (!p[i] || match(p[i])) {p[i]=x;return 1;}
    		}
    	return 0;
    }
    int main() {
    	int T;scanf("%d",&T);
    	while (T--) {
    		scanf("%d",&n);
    		for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    		for (int i=1;i<=n;i++) scanf("%d",&b[i]);
    		Init();
    		for (int i=1;i<=n;i++)
    			for (int j=1;j<=n;j++) scanf("%d",&f[i][j]);
    		for (int i=1;i<=n;i++) if (a[i]) f[i][i]=1;
    		for (int i=1;i<=n;i++) if ((a[i] && !b[i]) || !a[i]) {
    				cnt++;
    				if (!match(i)) {flag=0;break;}
    			}
    		if (!flag) puts("T_T");
    		else puts("^_^");
    	}
        return 0;
    }
    

      

  • 相关阅读:
    AjaxHelper使用范例
    IE浏览器的条件编译指令和微软的ajax实现
    基于AjaxHelper0.41的相册范例程序演示及一个关于博客园的功能建议
    AjaxHelper 0.41
    .Net环境下基于Ajax的MVC方案
    Msys/MinGW与Cygwin/gcc[转]
    常见应用程序的架构
    perl正则表达式[转]
    [CruiseControl] 概念
    MinGW
  • 原文地址:https://www.cnblogs.com/MashiroSky/p/6197379.html
Copyright © 2020-2023  润新知