[ZJOI2009]假期的宿舍,洛谷之提高历练地,较复杂图论II

原创 2018年04月15日 15:14:37

正题

      第三题:[ZJOI2009]假期的宿舍

      这道题根据题意我们可以发现,一部分人有床,一部分人没有床,一部分人需要床,一部分人不需要床。然而那些人有洁癖,只会睡在自己的或者认识的人的床。

      那么很明显我们就想到了二分图最大匹配。把有床的人和需要床的人的集合分为左右两个集合,那么很明显有床的人可以贡献一的流量(一张床),而需要床的人需要享受一的流量(一张床),所以构图方法就显然了,从begin到每个有床的人建一条流量为1的边,从每个需要床的人到end建一条流量为1的边,然后中间认识的人建一条边即可。这道题跟飞行员匹配问题有点像

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;

int n;
struct edge{
	int y,next,c;
}s[100010];
int first[1010];
int h[1010];
int t;
int len=1;
int begin,end;
bool tf[1010];
queue<int> f;

void ins(int x,int y,int c){
	len++;
	s[len].y=y;s[len].c=c;s[len].next=first[x];first[x]=len;
	len++;
	s[len].y=x;s[len].c=0;s[len].next=first[y];first[y]=len;
}

bool bfs(){
	f.push(begin);
	memset(h,-1,sizeof(h));
	h[begin]=1;
	while(!f.empty()){
		int x=f.front();
		f.pop();
		for(int i=first[x];i!=0;i=s[i].next){
			int y=s[i].y;
			if(h[y]==-1 && s[i].c>0){
				h[y]=h[x]+1;
				f.push(y);
			}
		}
	}
	return h[end]!=-1;
}

int dfs(int x,int t){
	if(x==end) return t;
	int tot=0;
	for(int i=first[x];i!=0;i=s[i].next){
		int y=s[i].y;
		if(tot==t) return t;
		if(h[y]==h[x]+1 && s[i].c>0){
			int my=dfs(y,min(t-tot,s[i].c));
			tot+=my;s[i].c-=my;s[i^1].c+=my;
		}
	}
	if(tot==0) h[x]=0;
	return tot;
}

int max_flow(){
	int tot=0;
	while(bfs()){
		int dx=dfs(begin,1e9);
		while(dx!=0){
			tot+=dx;
			dx=dfs(begin,1e9);
		}
	}
	return tot;
}

int main(){
	scanf("%d",&t);
	while(t--){
		len=1;
		memset(first,0,sizeof(first));
		scanf("%d",&n);
		memset(tf,false,sizeof(tf));
		begin=0,end=2*n+1;
		int tt=0;
		for(int i=1;i<=n;i++){
			int x;
			scanf("%d",&x);
			if(x==1) {
				tf[i]=true;
				ins(n+i,end,1);
			}
		}
		for(int i=1;i<=n;i++){
			int x;
			scanf("%d",&x);
			if(x==1 && tf[i]==true) tt++;
			else ins(begin,i,1);
		}
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++){
				int x;
				scanf("%d",&x);
				if(i==j || x==1) ins(i,j+n,1);
			}
		if(max_flow()==n-tt) printf("^_^\n");
		else printf("T_T\n");
	}
}

版权声明: https://blog.csdn.net/Deep_Kevin/article/details/79949459

汇编语言程序设计II

-
  • 1970年01月01日 08:00

SuperGCD,洛谷之提高历练地,数论(3-5)

前话      数论就是研究整数的理论。包括公约公倍数、质数、欧拉定理和同余方程等。正文       其实数论不止那么简单正文      第一题:SuperGCD      这一题就是很烦的代码加很烦...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-07 17:19:43
  • 17

[SDOI2009]E&D,洛谷之提高历练地,博弈论(3-6)

正题      第四题:[SDOI2009]E&amp;amp;D      这题不是如此的简单,因为它要涉及到找规律和Sg函数。      首先的,我们可以打一个表来观察之间的关系。      Sg...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-08 13:48:45
  • 14

【BZOJ 1433】 [ZJOI2009]假期的宿舍

二分图求最大匹配~
  • Regina8023
  • Regina8023
  • 2015-03-09 19:42:50
  • 931

bzoj1433[ZJOI2009]假期的宿舍

Description Input Output Sample Input 1 3 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 Sam...
  • zhb1997
  • zhb1997
  • 2014-06-13 22:32:01
  • 706

洛谷 P2055 [ZJOI2009]假期的宿舍

匈牙利算法
  • chai_jing
  • chai_jing
  • 2016-11-10 19:15:24
  • 269

【bzoj1433】[ZJOI2009]假期的宿舍 二分图匹配

总之,按照要求连边就对了。裸的最大匹配。 #include #include #include #include #include #include #define maxn 110 us...
  • u012288458
  • u012288458
  • 2016-02-16 11:00:31
  • 723

[SDOI2009]Elaxia的路线,洛谷之提高历练地,较复杂图论II

正题      第四题:[SDOI2009]Elaxia的路线      这道题好像很麻烦。。。      首先我们可以知道,如果边(x,y,c)为x1到y1最短路路径上的一条边,那么它肯定满足   ...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-15 15:27:11
  • 3

小K的农场,洛谷之提高历练地,较复杂图论II

正题      第一题:小K的农场      这道题的三个形式分别可以表示为:Ta-Tb&amp;gt;=c;Ta-Tb&amp;lt;=c;Ta-Tb=0;      相当于就是判断是否有解,我们把...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-15 14:16:42
  • 2

杂务,洛谷之提高历练地,较复杂图论I

正题      第一题:杂务      这题虽然看上去很麻烦,但是很容易就可以看出,1没有先决任务。      所以任务就转换为求1到其他点长度的最长路,当然权值在边上。代码&amp;lt;其实SPF...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-12 11:30:10
  • 3
收藏助手
不良信息举报
您举报文章:[ZJOI2009]假期的宿舍,洛谷之提高历练地,较复杂图论II
举报原因:
原因补充:

(最多只允许输入30个字)