BZOJ-1433 假期的宿舍 最大流+基础建图
网络流练习ing。。
1433: [ZJOI2009]假期的宿舍
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1748 Solved: 765
[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 Outpu**t
ˆ-ˆ
HINT
对于30% 的数据满足1 ≤ n ≤ 12。
对于100% 的数据满足1 ≤ n ≤ 50,1 ≤ T ≤ 20。
基础建图:
超级源连向所有在校生(有床位的人);所有在校生且不回家的,与所有非在校生的与超级源相连;每个点分成两个i与i',如果i和j认识连i与j';边权全部为1
最大流即为答案。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define M 1000010
struct data{
int to,next,v;
}edge[M];
int head[M],cnt=1;
int dis[M];
int q[M],h,t;
int c,n,ans,num;
int zx[60],know[60][60],hj[60];
//zx【】是否在校,know【】【】是否认识,hj【】是否回家
void add(int u,int v,int w)
{
cnt++;
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
edge[cnt].v=w;
}
void make()//超级源为0,超级汇为2*n+1
{
cnt=1; memset(head,0,sizeof(head));
num=0;
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
if (know[i][j]==1)
{
add(i,j+n,1);
add(j+n,i,0);
}
for (int i=1; i<=n; i++)
{
if (zx[i]==1)
{
add(0,i,1);
add(i,0,0);
}
if ((zx[i]==1 && hj[i]==0) || (zx[i]==0))
{
add(i+n,2*n+1,1);
add(2*n+1,i+n,0);
num++;//需要床位数
}
}
}
bool bfs()
{
memset(dis,-1,sizeof(dis));
q[1]=0; dis[0]=1;
h=0; t=1;
while (h<t)
{
int j=q[++h],i=head[j];
while (i)
{
if (edge[i].v>0 && dis[edge[i].to]<0)
{
dis[edge[i].to]=dis[j]+1;
q[++t]=edge[i].to;
}
i=edge[i].next;
}
}
if (dis[2*n+1]>0)
return true;
else
return false;
}
int dfs(int loc,int low)
{
int flow=0;
if (loc==2*n+1) return low;
int i=head[loc];
while (i)
{
if (edge[i].v>0 && dis[edge[i].to]==dis[loc]+1 && (flow=dfs(edge[i].to,min(low,edge[i].v))))
{
edge[i].v-=flow;
edge[i^1].v+=flow;
return flow;
}
i=edge[i].next;
}
return 0;
}
int main()
{
scanf("%d",&c);
while (c--)
{
scanf("%d",&n);
memset(zx,0,sizeof(zx));
memset(hj,0,sizeof(hj));
memset(know,0,sizeof(know));
for (int i=1; i<=n; i++)
scanf("%d",&zx[i]);
for (int i=1; i<=n; i++)
scanf("%d",&hj[i]);
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
scanf("%d",&know[i][j]);
for (int i=1; i<=n; i++)
know[i][i]=1;//由题意自己和自己在读入时为不能睡,但实际可以,修改。
make();
ans=0;
while (bfs())
{
int now=0;
while ((now=dfs(0,0x7fffffff)))
ans+=now;
}
if (num==ans)
puts("^_^");
else
puts("T_T");
}
return 0;
}
BZOJ-1433 假期的宿舍 最大流+基础建图的更多相关文章
- poj--1149--PIGS(最大流经典建图)
PIGS Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u Submit Status D ...
- bzoj 1433: [ZJOI2009]假期的宿舍 -- 最大流
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MB Description Input Output Sample Input ...
- bzoj1433 [ZJOI2009]假期的宿舍 最大流
[ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3429 Solved: 1459[Submit][Status][D ...
- 洛谷$P2055\ [ZJOI2009]$ 假期的宿舍 最大流
正解:最大流 解题报告: 传送门$QwQ$ 这种一看就很网络流鸭,直接说咋建图趴. 考虑把在校的人拆成人和床.$S$连向所有不回家的人,所有床连向$T$,认识的人之间人向床连边,跑个最大流就成. $o ...
- 【BZOJ-2879】美食节 最小费用最大流 + 动态建图
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1366 Solved: 737[Submit][Status] ...
- POJ2195费用流+BFS建图
题意: 给你一个n*m的地图,上面有w个人,和w个房子,每个人都要进房子,每个房子只能进一个人,问所有人都进房子的路径总和最少是多少? 思路: 比较简单的最大流,直接建立两排, ...
- POJ1149 最大流经典建图PIG
题意: 有一个人,他有m个猪圈,每个猪圈里都有一定数量的猪,但是他没有钥匙,然后依次来了n个顾客,每个顾客都有一些钥匙,还有他要卖猪的数量,每个顾客来的时候主人用顾客的钥匙打开相应的门,可 ...
- 洛谷 - P2055 - 假期的宿舍 - 最大流
https://www.luogu.org/problemnew/show/P2055 这是一个错误的示范. 一开始觉得就找一条路从外校同学连到本校同学然后最终从周末回家的同学流出,每个人睡后一个人的 ...
- BZOJ 2095 [Poi2010]Bridges (二分+最大流判断混合图的欧拉回路)
题面 nnn个点,mmm条双向边(正向与反向权值不同),求经过最大边权最小的欧拉回路的权值 分析 见 commonc大佬博客 精髓就是通过最大流调整无向边的方向使得所有点的入度等于出度 CODE #i ...
随机推荐
- 注解与反射 ---Spring与Mybatis等框架的实现原理
Java中各大框架,无论是AOP 还是 IoC 其基本实现思路都是源自Java 运行时支撑的反射功能, 而反射最基本的一点就是 任何一个类 其在JVM环境中,都有一个对象的Class对象,这个对象提供 ...
- escape()、encodeURI()、encodeURIComponent()区别详解
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...
- Oracle11G安装之后
本人对oracle还处于摸索阶段,今天安装了一下Oracle11G, 安装之后,后台管理端的登录地址:https://172.16.10.75:1158/em 1.使用之前设置的dba管理员密码账号登 ...
- wooyun本地数据抓取
---- #-*-coding:utf-8-*- import re import urllib import MySQLdb import time from urllib import unquo ...
- flask 使用 SQLAlchemy 的两种方式
1. 使用 flask-SQLAlchemy 扩展 # flask-ext-sqlalchemy.py from flask import Flask from flask.ext.sqlalchem ...
- Linux常用指令---$PATH (环境变量)
实例一:设置临时环境变量 在linux服务器上设置临时环境变量,当退出shell环境时,自动销毁 export JAVA_HOME=/usr/java/jdk1.6.0_32 export class ...
- 简单通用JDBC辅助类封装
哎,最近很好久没在博客园写点东西了,由于工作的原因,接触公司自己研发的底层orm框架,偶然发现该框架在调用jdbc操作的时候参考的是hibernate 里面的SimpleJdbcTemplate,这里 ...
- C# Winform实现炫酷的透明动画界面
做过.NET Winform窗体美化的人应该都很熟悉UpdateLayeredWindow吧,UpdateLayeredWindow可以实现窗体的任意透明,效果很好,不会有毛边.不过使用这个API之后 ...
- Orchard常见问题
本文链接:http://www.cnblogs.com/souther/p/4543299.html 什么是Orchard Orchard是一个免费,开源,注重社区的项目,其目标是提供ASP.NET平 ...
- c++实现简单计算器
帮一个同学写的,非计算机类专业,应付交差,也没什么功能,两个数的加减乘除运算,以及三角函数的运算.要求用到模板.运算符重载和异常处理. 一直以来都是用的java,没怎么用过c++,就当是复习了一下c+ ...