2502: 清理雪道

Time Limit: 10 Sec  Memory Limit: 128 MB

Description

       滑雪场坐落在FJ省西北部的若干座山上。
从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向。
你的团队负责每周定时清理雪道。你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部。从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道。
由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务。
 

Input

输入文件的第一行包含一个整数n (2 <= n <= 100) – 代表滑雪场的地点的数量。接下来的n行,描述1~n号地点出发的斜坡,第i行的第一个数为mi (0 <= mi < n) ,后面共有mi个整数,由空格隔开,每个整数aij互不相同,代表从地点i下降到地点aij的斜坡。每个地点至少有一个斜坡与之相连。

Output

       输出文件的第一行是一个整数k – 直升飞机的最少飞行次数。

Sample Input

8
1 3
1 7
2 4 5
1 8
1 8
0
2 6 5
0

Sample Output

4
 
题解:
 接触到的第一道上下界网络流题目……我怎么什么题都不会啊.jpg
如果你对上下界网络流没有接触的话,首先安利一波liu_runda学长的学习笔记,
在你已经会来上下界网络流之后……
大概这是一道水题吧233
先计算出附加流,然后从附加源ss跑到附加汇tt的最大流,
这样我们就得到了一个可行流,在t->s的弧上面把可行流的流量ans1提取出来。
然后我们去掉t->s的弧以及ss,tt两个附加点,再跑一边t->s最大流
由于反向边的流量增加意味着正向边的流量减少,所以设这样跑出来的最大流是ans2,答案就是ans1-ans2。
这样我们就解决了本题。代码实现:
 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=,inf=0x7fffffff;
struct edge{int zhong,next,flow;};
struct NetWork
{
int n,S,T,e,adj[N],cur[N];
int hd,tl,que[N],dist[N],gap[N];
edge s[N<<];
inline void intn(int sz)
{
n=sz,e=,memset(adj,,sizeof(adj));
memset(dist,,sizeof(dist));
memset(gap,,sizeof(gap));
}
inline void add(int qi,int zhong,int flow)
{s[++e].zhong=zhong;s[e].next=adj[qi];adj[qi]=e;s[e].flow=flow;}
inline void bfs()
{
hd=,tl=,dist[T]=,que[++tl]=T;
register int i,x,u;
while(hd<=tl)
for(x=que[hd++],++gap[dist[x]],i=adj[x];i;i=s[i].next)
if(!dist[s[i].zhong])
dist[s[i].zhong]=dist[x]+,que[++tl]=s[i].zhong;
}
int Shoot(int rt,int maxf)
{
if(rt==T||!maxf)return maxf;
register int i,f,ret=;
for(i=cur[rt];i;i=s[i].next)
if(s[i].flow&&dist[rt]==dist[s[i].zhong]+)
{
f=Shoot(s[i].zhong,min(s[i].flow,maxf)),
maxf-=f,ret+=f,s[i].flow-=f,s[i^].flow+=f;
if(!maxf)return ret;
}
if(!(--gap[dist[rt]]))dist[S]=n+;
++gap[++dist[rt]],cur[rt]=adj[rt];
return ret;
}
inline int ISAP(int a,int b)
{
S=a,T=b;int maxf=;bfs();
memcpy(cur,adj,sizeof(adj));
while(dist[S]<=n)maxf+=Shoot(S,inf);
return maxf;
}
inline void cut_off(int x)
{
register int i;
for(i=adj[x];i;i=s[i].next)
s[i].flow=s[i^].flow=;
}
inline void get_ans(int a,int b,int ss,int tt)
{
add(b,a,inf),add(a,b,),ISAP(ss,tt);
int ans=s[e].flow;
s[e].flow=s[e^].flow=;
cut_off(ss),cut_off(tt);
printf("%d\n",ans-ISAP(b,a));
}
}SAP;
int n,m,S,T,SS,TT;
int rudu[N],chudu[N],du[N];
int main()
{
scanf("%d",&n),S=,T=n+,SS=T+,TT=SS+;
SAP.intn(TT+);
register int a,b,i,j;
for(i=;i<=n;++i)
for(scanf("%d",&a),j=;j<=a;++j)
scanf("%d",&b),++du[b],--du[i],
++chudu[i],++rudu[b],
SAP.add(i,b,inf),SAP.add(b,i,);
for(i=;i<=n;++i)
{
if(!rudu[i])SAP.add(S,i,inf),SAP.add(i,S,);
if(!chudu[i])SAP.add(i,T,inf),SAP.add(T,i,);
}
for(i=;i<=n;++i)
{
if(du[i]>)SAP.add(SS,i,du[i]),SAP.add(i,SS,);
if(du[i]<)SAP.add(i,TT,-du[i]),SAP.add(TT,i,);
}
SAP.get_ans(S,T,SS,TT);
}
 
 

[BZOJ2502]清理雪道 有上下界网络流(最小流)的更多相关文章

  1. BZOJ2502:清理雪道(有上下界最小流)

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

  2. Bzoj 2502: 清理雪道 有上下界网络流_最小流

    好长时间没有写网络流了,感觉好手生.对于本题,设一个源点 $s$ 和 $t$.1.由 $s$ 向每个点连一条没有下界,容量为无限大的边,表示以该点为起点.2.由每个点向 $t$ 连一条没有下界,容量为 ...

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

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

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

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

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

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

  6. 【BZOJ2502】清理雪道 有上下界的网络流 最小流

    [BZOJ2502]清理雪道 Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降 ...

  7. sgu 176 有源汇有上下界的最小流模板题

    /*参考博文:http://hi.baidu.com/dragon_eric123/item/82e259200ece744046996282 有上下界的有源最小流 */ #include<st ...

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

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

  9. sgu 176 上下界网络流最小可行流带输出方案

    算法步骤: 1. 先将原图像最大可行流那样变换,唯一不同的是不加dst->src那条边来将它变成无源无汇的网络流图.直接跑一边超级源到超级汇的最大流. 2. 加上刚才没有加上的那条边p 3. 再 ...

随机推荐

  1. websocket protocal

    same-orgins:浏览器同源策略的安全模型   持久化协议   双向双工  多路复用, 同时发信息   区别HTTP连接特点:  http只能由客户端发起,一个request对应一个respon ...

  2. 《Redis设计与实现》阅读笔记(一)--Redis学习

    Redis学习资料与过程记录 在实习中经常会用到很多Redis,对Redis有了一些模糊的了解,总觉得隔靴搔痒的不痛快,所以决定开始深入的了解Redis,也作为我实习期间的目标. 这篇只是为了占个位置 ...

  3. jquery 3.0 新版本

    https://code.jquery.com/

  4. vue 自定义全局按键修饰符

    在监听键盘事件时,我们经常需要检查常见的键值.Vue 允许为 v-on 在监听键盘事件时添加按键修饰符: JS部分: Vue.config.keyCodes = { f2:113, } var app ...

  5. 【Coursera-ML-Notes】线性回归(上)

    什么是机器学习 关于机器学习,有以下两种不同的定义. 机器学习是研究如何使电脑具备学习能力,而不用显式编程告诉它该怎么做. the field of study that gives computer ...

  6. python爬虫项目(新手教程)之知乎(requests方式)

    -前言 之前一直用scrapy与urllib姿势爬取数据,最近使用requests感觉还不错,这次希望通过对知乎数据的爬取为 各位爬虫爱好者和初学者更好的了解爬虫制作的准备过程以及requests请求 ...

  7. React Native iOS 离线包

    平时使用React Native 时候, js代码和图片资源运行在一个Debug Server上(需要cd 到RN目录,然后终端执行 npm start 命令开启本地服务 ).每次更新代码之后只需要使 ...

  8. Task 6.4 冲刺Two之站立会议6

    今天对视频的画面质量进行了优化,又把所有的界面更换了一些比较美观的图片和背景.使界面看起来更加地合理,易于接受.

  9. javascript修改div大小遮挡页面渲染问题

    页面中引入了其他js文件,浏览器窗口改变,页面没有跟随渲染问题.最后找到原因是因为这个js方法少了最后一行: "right": RightBox_w. window.onresiz ...

  10. Head First Java & static