bzoj 2502 清理雪道 (有源汇上下界最小流)
2502: 清理雪道
Time Limit: 10 Sec Memory Limit: 128 MB
Description
Input
输入文件的第一行包含一个整数n (2 <= n <= 100) – 代表滑雪场的地点的数量。接下来的n行,描述1~n号地点出发的斜坡,第i行的第一个数为mi (0 <= mi < n) ,后面共有mi个整数,由空格隔开,每个整数aij互不相同,代表从地点i下降到地点aij的斜坡。每个地点至少有一个斜坡与之相连。
Output
Sample Input
1 3
1 7
2 4 5
1 8
1 8
0
2 6 5
0
Sample Output
#include<cstdio>
#include<queue>
#include<algorithm>
#define N 105
#define M 40001
using namespace std;
const int inf=2e9;
int n,a[N],ans;
int src,dec,S,T;
int to[M],next[M],front[N],tot=,cap[M];
int lev[N],cur[N];
queue<int>q;
void add(int u,int v,int w)
{
to[++tot]=v; next[tot]=front[u]; front[u]=tot; cap[tot]=w;
to[++tot]=u; next[tot]=front[v]; front[v]=tot; cap[tot]=;
}
bool bfs(int s,int t)
{
for(int i=;i<=n+;i++) cur[i]=front[i],lev[i]=-;
while(!q.empty()) q.pop();
lev[s]=;
q.push(s);
int now;
while(!q.empty())
{
now=q.front(); q.pop();
for(int i=front[now];i;i=next[i])
if(cap[i]>&&lev[to[i]]==-)
{
lev[to[i]]=lev[now]+;
if(to[i]==t) return true;
q.push(to[i]);
}
}
return false;
}
int dfs(int now,int t,int flow)
{
if(now==t) return flow;
int rest=,delta;
for(int i=front[now];i;i=next[i])
if(cap[i]>&&lev[to[i]]>lev[now])
{
delta=dfs(to[i],t,min(flow-rest,cap[i]));
if(delta)
{
cap[i]-=delta; cap[i^]+=delta;
rest+=delta; if(rest==flow) return rest;
}
}
if(rest!=flow) lev[now]=-;
return rest;
}
int dinic(int s,int t)
{
while(bfs(s,t)) dfs(s,t,inf);
}
int main()
{
scanf("%d",&n);
dec=n+; S=n+;T=n+;
for(int i=;i<=n;i++) add(i,dec,inf);
for(int i=;i<=n;i++) add(src,i,inf);
int x,y;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
while(x--)
{
scanf("%d",&y);
add(i,y,inf);
a[y]++; a[i]--;
}
}
for(int i=;i<=n;i++)
if(a[i]>) add(S,i,a[i]);
else if(a[i]<) add(i,T,-a[i]);
dinic(S,T);
add(dec,src,inf);
dinic(S,T);
printf("%d",cap[tot]);
}
法二、先由普通汇点向普通源点连一条下界为0,上界为inf的边,再由超级源点向超级汇点跑一遍dinic,记那条边的流量为okflow
删去那条边,删去超级源点,删去超级汇点,由普通汇点向普通源点跑一遍dinic,得出最大流为a,
答案为okflow-a
#include<cstdio>
#include<queue>
#include<algorithm>
#define N 105
#define M 40001
using namespace std;
const int inf=2e9;
int n,a[N],ans;
int src,dec,S,T;
int to[M],next[M],front[N],tot=,cap[M];
int lev[N],cur[N];
queue<int>q;
void add(int u,int v,int w)
{
to[++tot]=v; next[tot]=front[u]; front[u]=tot; cap[tot]=w;
to[++tot]=u; next[tot]=front[v]; front[v]=tot; cap[tot]=;
}
bool bfs(int s,int t)
{
for(int i=;i<=n+;i++) cur[i]=front[i],lev[i]=-;
while(!q.empty()) q.pop();
lev[s]=;
q.push(s);
int now;
while(!q.empty())
{
now=q.front(); q.pop();
for(int i=front[now];i;i=next[i])
if(cap[i]>&&lev[to[i]]==-)
{
lev[to[i]]=lev[now]+;
if(to[i]==t) return true;
q.push(to[i]);
}
}
return false;
}
int dfs(int now,int t,int flow)
{
if(now==t) return flow;
int rest=,delta;
for(int i=front[now];i;i=next[i])
if(cap[i]>&&lev[to[i]]>lev[now])
{
delta=dfs(to[i],t,min(flow-rest,cap[i]));
if(delta)
{
cap[i]-=delta; cap[i^]+=delta;
rest+=delta; if(rest==flow) return rest;
}
}
if(rest!=flow) lev[now]=-;
return rest;
}
int dinic(int s,int t)
{
int tmp=;
while(bfs(s,t))
tmp+=dfs(s,t,inf);
return tmp;
}
void del(int x)
{
for(int i=front[x];i;i=next[i])
cap[i]=cap[i^]=;
}
int main()
{
scanf("%d",&n);
dec=n+; S=n+;T=n+;
for(int i=;i<=n;i++) add(i,dec,inf);
for(int i=;i<=n;i++) add(src,i,inf);
int x,y;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
while(x--)
{
scanf("%d",&y);
add(i,y,inf);
a[y]++; a[i]--;
}
}
for(int i=;i<=n;i++)
if(a[i]>) add(S,i,a[i]);
else if(a[i]<) add(i,T,-a[i]);
add(dec,src,inf);
dinic(S,T);
int okflow=cap[tot];
del(T); del(S); cap[tot]=cap[tot-]=;
printf("%d",okflow-dinic(dec,src));
}
bzoj 2502 清理雪道 (有源汇上下界最小流)的更多相关文章
- BZOJ 2502 清理雪道/ Luogu P4843 清理雪道 (有源汇上下界最小流)
题意 有一个有向无环图,求最少的路径条数覆盖所有的边 分析 有源汇上下界最小流板题,直接放代码了,不会的看dalao博客:liu_runda 有点长,讲的很好,静心看一定能看懂 CODE #inclu ...
- BZOJ 2502 清理雪道(有源汇上下界最小流)
题面 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机, ...
- BZOJ_2502_清理雪道_有源汇上下界最小流
BZOJ_2502_清理雪道_有源汇上下界最小流 Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道), ...
- 【Loj117】有源汇上下界最小流(网络流)
[Loj117]有源汇上下界最小流(网络流) 题面 Loj 题解 还是模板题. #include<iostream> #include<cstdio> #include< ...
- hdu3157有源汇上下界最小流
题意:有源汇上下界最小流裸题,主要就是输入要用字符串的问题 #include<bits/stdc++.h> #define fi first #define se second #defi ...
- sgu176 有源汇上下界最小流
题意:有一堆点和边,1起点,n终点,某些边有可能必须满流,要求满足条件的最小流 解法:按原图建边,满流的即上下界都是容量,但是这样按有源汇上下界可行流求出来的可能不是最小流,那么我们需要开始建边的时候 ...
- HDU 3157 Crazy Circuits (有源汇上下界最小流)
题意:一个电路板,上面有N个接线柱(标号1~N) 还有两个电源接线柱 + - 然后是 给出M个部件正负极的接线柱和最小电流,求一个可以让所有部件正常工作的总电流. 析:这是一个有源汇有上下界的 ...
- SGU 176 Flow construction(有源汇上下界最小流)
Description 176. Flow construction time limit per test: 1 sec. memory limit per test: 4096 KB input: ...
- HDU 3157 Crazy Circuits(有源汇上下界最小流)
HDU 3157 Crazy Circuits 题目链接 题意:一个电路板,上面有N个接线柱(标号1~N),还有两个电源接线柱 + -.给出一些线路,每一个线路有一个下限值求一个能够让全部部件正常工作 ...
随机推荐
- ORACLE公司传奇历史
ORACLE公司传奇 ORACLE公司之起源 很难想象,ORACLE 公司的这一段传奇居然要从 IBM 公司开始. 1970年的6月,IBM 公司的研究员埃德加·考特 (Edgar Frank Cod ...
- Struts2(七)
以下内容是基于导入struts2-2.3.32.jar包来讲的 1.xml验证 Struts2提供了验证器,实现了通用的验证逻辑.例如: 非空验证器.长度验证器.日期验证器.email验证器等.具体定 ...
- 【week8】psp~~进度条
本周psp 项目 内容 开始时间 结束时间 中断时间 净时间 10月7日 星期一 论文 看生物信息方面的论文 10:00 12:00 5 115 写代码 注册信息从前台传入servlet 18:00 ...
- 使用java程序模拟页面发送http的post请求
在web应用程序中,一般都是通过页面发送http的post请求,但也可以使用java程序来模拟页面发送请求,代码如下: import java.io.BufferedReader; import ja ...
- 将Python项目生成所有依赖包的清单requirements .txt文件
在开发中不同的项目总会牵扯到各种不同作用的包安装,下面是总结一下对写好的项目自动生成依赖清单,以及在新环境下解决依赖的方法: 一:生成所有依赖清单requirements.txt 这里需要使用到的工具 ...
- javascript之彻底理解闭包
闭包是函数和声明该函数的词法环境的组合. function init() { var name = "Mozilla"; // name 是一个被 init 创建的局部变量 fun ...
- perf的采样模式和统计模式
perf的采样模式和统计模式 统计模式和采样模式使用寄存器的方法不相同; 在统计模式下,每次调度之前设置寄存器,调度之后清理寄存器,留个下个进程使用;PMU寄存器的使用方法; 在采样模式下,每次 pm ...
- Redis 备份数据的两种方式
既然是数据库,那就一定有数据备份方式了,而且 Redis 是内存形式的数据库,更需要数据备份了,要不然断电数据就全都丢失了. Redis 数据备份有两种方式: RDB(数据快照) AOF(记录操作日志 ...
- JSP 问题总结
<input type="button" value="返回" onclick="javascript:window.location.href ...
- HDU4473_Exam
很考验智商的一个题目,赛后看完别人的题解后秒懂了. 首先定义一个函数f(x)表示a,b的有序组合情况数使得a*b为x的一个约数. 现在给定你一个n,要你求出f(1)+f(2)+……+f(n): 题目智 ...