bzoj 1433: [ZJOI2009]假期的宿舍(最大流)

1433: [ZJOI2009]假期的宿舍

Time Limit: 10 Sec   Memory Limit: 162 MB
Submit: 2034   Solved: 873
[ Submit][ Status][ Discuss]

Description

Input

Output

Sample Input

1
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0

Sample Output

ˆ ˆ

HINT

对于30% 的数据满足1 ≤ n ≤ 12。
对于100% 的数据满足1 ≤ n ≤ 50,1 ≤ T ≤ 20。

Source

[ Submit][ Status][ Discuss]

题解:源点->不回家在校生+所有外校生

           所有在校生->汇点

                  两个人相互认识,pd[i][j]=1并且j有床铺,那么i->j的床铺,容量为1

          如果在校生不回家,那么i->i的床铺

#include
#include
#include
#include
#include
#include
#define N 100000
#define inf 1000000000
using namespace std;
int n,m,t;
int next[N],point[N],remain[N],v[N];
int a[N],b[N],tot,num1,sum;
int deep[N],last[N],num[N],cur[N];
void add(int x,int y,int z)
{
	tot++; next[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=z;
	tot++; next[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0;
}
int addflow(int s,int t)
{
	int now=t; int ans=inf;
	while (now!=s)
	{
		ans=min(ans,remain[last[now]]);
		now=v[last[now]^1];
	}
	now=t;
	while (now!=s)
	{
		remain[last[now]]-=ans;
		remain[last[now]^1]+=ans;
		now=v[last[now]^1];
	}
	return ans;
}
void bfs(int s,int t)
{
	for (int i=s;i<=t;i++) deep[i]=t;
	deep[t]=0; 
	queue p; p.push(t);
	while (!p.empty())
	{
		int now=p.front(); p.pop();
		for (int i=point[now];i!=-1;i=next[i])
		 if (deep[v[i]]==t&&remain[i^1])
		  deep[v[i]]=deep[now]+1,p.push(v[i]);
	}
}
int isap(int s,int t)
{
	bfs(s,t);
	for (int i=s;i<=t;i++) cur[i]=point[i];
	for (int i=s;i<=t;i++) num[deep[i]]++;
	int now=s; int ans=0;
	while (deep[s]



你可能感兴趣的:(网络流)