好长时间没有写网络流了,感觉好手生.
对于本题,设一个源点 $s$ 和 $t$.
1.由 $s$ 向每个点连一条没有下界,容量为无限大的边,表示以该点为起点.
2.由每个点向 $t$ 连一条没有下界,容量为无限大的边,表示以该点为终点.
为了保证每条原图中得边都能被覆盖掉,再将原图中的边连一条无上界,下界为 1 的边.
最后,跑一遍最小流即可.

Code:

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 2000
#define inf 1000000
int tot;
void ini(){ tot=1000; }
int newnode(){ return ++tot; }
struct Edge{
int from,to,cap;
Edge(int a=0,int b=0,int c=0):from(a),to(b),cap(c){}
};
vector<int>G[maxn];
vector<Edge>edges;
void addedge(int u,int v,int c){
edges.push_back(Edge(u,v,c));
edges.push_back(Edge(v,u,0));
int m=edges.size();
G[u].push_back(m-2);
G[v].push_back(m-1);
}
namespace maxflow{
int s,t;
int d[maxn],vis[maxn];
int current[maxn];
queue<int>Q;
int BFS(){
memset(vis,0,sizeof(vis));
vis[s]=1,d[s]=0;
Q.push(s);
while(!Q.empty()){
int u=Q.front();Q.pop();
int sz=G[u].size();
for(int i=0;i<sz;++i){
Edge v=edges[G[u][i]];
if(!vis[v.to]&&v.cap>0) {
d[v.to]=d[u]+1,vis[v.to]=1;
Q.push(v.to);
}
}
}
return vis[t];
}
int dfs(int x,int cur){
if(x!=t){
int f,flow=0,sz=G[x].size();
for(int i=current[x];i<sz;++i){
current[x]=i;
Edge r = edges[G[x][i]];
if(d[r.to]==d[x]+1&&r.cap>0) {
f=dfs(r.to,min(cur,r.cap));
if(f>0){
flow+=f,cur-=f;
edges[G[x][i]].cap-=f,edges[G[x][i]^1].cap+=f;
}
}
if(!cur) break;
}
return flow;
}
else return cur;
}
int GET(){
int ans=0;
while(BFS()) {
memset(current,0,sizeof(current));
ans+=dfs(s,inf);
}
return ans;
}
};
int main(){
//setIO("input");
ini();
int n,s,t,ss,tt;
s=0,t=newnode(),ss=newnode(),tt=newnode();
scanf("%d",&n);
for(int i=1,m=0,v;i<=n;++i) {
scanf("%d",&m);
while(m--){
scanf("%d",&v);
addedge(i,v,inf-1),addedge(s,i,inf),addedge(v,t,inf);
addedge(ss,v,1),addedge(i,tt,1);
}
}
int rec=edges.size();
addedge(t,s,inf);
maxflow::s=ss,maxflow::t=tt;
maxflow::GET();
int ans1=edges[rec^1].cap;
edges[rec^1].cap=edges[rec].cap=0;
maxflow::s=t, maxflow::t=s;
ans1-=maxflow::GET();
printf("%d",ans1);
return 0;
}

  

Bzoj 2502: 清理雪道 有上下界网络流_最小流的更多相关文章

  1. [BZOJ2502]清理雪道 有上下界网络流(最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场 ...

  2. BZOJ 2502: 清理雪道 | 有上下界最小流

    #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #defi ...

  3. P4843 清理雪道(上下界网络流)

    P4843 清理雪道 上下界最小流 我们先搞一遍上下界可行流(转) 回忆上下界最大流的写法:在可行流的残量网络$s\ -\ t$上跑最大流,答案为可行流$+$残量网络的最大流 那么上下界最小流的写法呢 ...

  4. BZOJ 2502: 清理雪道

    BZOJ 2502: 清理雪道 标签(空格分隔): OI-BZOJ OI-最小流 OI-上下界网络流 Time Limit: 10 Sec Memory Limit: 128 MB Descripti ...

  5. hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )

    题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...

  6. HDU3157 Crazy Circuits(有源汇流量有上下界网络的最小流)

    题目大概给一个电路,电路上有n+2个结点,其中有两个分别是电源和负载,结点们由m个单向的部件相连,每个部件都有最少需要的电流,求使整个电路运转需要的最少电流. 容量网络的构建很容易,建好后就是一个有源 ...

  7. bzoj 2502 清理雪道 (有源汇上下界最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场 ...

  8. 【BZOJ-2502】清理雪道 有上下界的网络流(有下界的最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 594  Solved: 318[Submit][Status][Discuss] ...

  9. 【bzoj2502】清理雪道 有上下界最小流

    题目描述 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞 ...

随机推荐

  1. vc++创建窗体

    //创建窗口,一般分为四步 /*1 WinMain函数的定义 2 创建一个窗口 3 编写消息循环 4 编写窗口过程函数*/ #include <windows.h> //包含windows ...

  2. Fiddler4抓包工具使用教程

    本文参考自http://blog.csdn.net/ohmygirl/article/details/17846199,纯属读书笔记,加深记忆 1.抓包工具有很多,为什么要使用Fiddler呢?原因如 ...

  3. Eclipse maven工程 Missing artifact com.sun:tools:jar:1.7.0:system 解决方法

    解决方案一:通过maven取运行时参数,eclipse提供的环境变量,基本类似System.getProperty("java.home") <dependency> ...

  4. Linux系统下的 /etc/fstab 文件解读

    1 [root@localhost ~]# cat /etc/fstab 2 3 # 4 # /etc/fstab 5 # Created by anaconda on Sat Nov 3 12:03 ...

  5. JAVA学习之枚举

    1.新建一个枚举类 public enum Apple{ FUJI, PIPPIN, GRANNY_SMITH } 通过查看字节码,可以看到,枚举类的实现方式: 1)继承自java.lang.Enum ...

  6. vue与animate.css的结合使用

    在vue项目中,由于页面需要动画效果,使用动画其实有多种方式,可以使用vue中的过渡transition,可以使用animate动画与transition配合使用,也可以单独使用animate动画库. ...

  7. C# litJson 使用方法

    对一般数据进行序列化和反序列化操作 static void jsonTest() { // JsonData jd = new JsonData(); jd["result"] = ...

  8. Spring学习总结(19)——Spring概念详解

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建.简单来说,Spring是一个分层的JavaSE/EEfull-stack(一 ...

  9. JAVA的基本数据类型和引用数据类型的区别

        引用数据类型: 类.接口类型.数组类型.枚举类型.注解类型:   基本数据类型和引用数据类型的区别: 基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上: 引用数据类型在被创 ...

  10. Qunie——自我生成程序

    Qunie是一段没有输入.但输出和它本身源代码同样的程序.本文无不论什么高深技术,纯属娱乐! 近期看到wikipedia的一个词条--Quine,简单介绍部分摘录于此,并简要翻译: A quine i ...