题面:

  Waldives 有 N 个小岛。目前的交通系统中包含 N-1 条快艇专线,每条快艇
  专线连接两个岛。这 N-1条快艇专线恰好形成了一棵树。
  由于特殊的原因,所有N-1条快艇专线都是单向的。这导致了很多岛屿之间
  不能相互到达。因此,Waldives 政府希望新建一些公交线路,使得建设完毕后,
  任意两个小岛都可以互相到达。为了节约开支,政府希望建设最少的公交线路。 
  同时,出于规划考虑,每一条公交线路都有如下的要求:
  1、每一条交通线路包含若干条连续的快艇专线,你可以认为一条公交线路  
  对应树上的一条路径,而其所包含的若干快艇专线则对应树上被这条路
  径所覆盖的树边(也就是之前已经存在的某个快艇专线);
  2、显然一条交通线路只能覆盖树上任意一条边至多一次;
  3、公交线路中所包含的每一个快艇专线都是有方向的,并且与其所覆盖的
  树边的方向相反;
  4、不同的公交线路可以覆盖树上相同的点或者相同的边。
  Waldives 的 N 个岛屿分别从 0 到 N-1 编号。现在给出 Waldives 已有的快艇
  专线信息,请计算最少所需要新建的交通线路的数量。

分析:

  这个题……

  复制一下yzy学长的题解吧……觉得说的已经很清楚+精炼了

  让每两个点都能相互到达显然需要覆盖所有的树边从S向每个点连边,从每个点向T连边。每条树边反向连一条下界为1,上界inf的边。跑最小流。

  最小流:

  类似 <有源汇上下界可行流> 的构图方法,但是不添加T到S的边,求一次超级源到超级汇的最大流。
  加边(T,S,0,+∞),在上一步残量网络基础上再求一次超级源到超级汇的最大流。
  流经T到S的边的流量就是最小流的值。
  该算法的思想是在第一步中尽可能填充循环流,以减小最小流的代价。

  数据范围感人……不加当前弧优化过不了……

代码:

 #include<bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
#define cpy() for(int i=0;i<=T;i++) cur[i]=h[i]
using namespace std;int S,T,tot=;
const int N=,inf=0x3f3f3f3f;
struct node{int y,z,nxt;}e[N*];
int a[N],q[N*],t[N],sm,cur[N];
int c=,h[N],d[N],m,k,n,ans;
void add(int x,int y,int z){
e[++c]=(node){y,z,h[x]};h[x]=c;
e[++c]=(node){x,,h[y]};h[y]=c;
} bool bfs(){int f=,t=;ms(d,-);
d[S]=;q[++t]=S;
while(f<=t){
int x=q[f++];
for(int i=h[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]==-&&e[i].z)
d[y]=d[x]+,q[++t]=y;
} return (d[T]!=-);
} int dfs(int x,int f){
if(x==T) return f;int w,tmp=;
for(int i=cur[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]==d[x]+&&e[i].z){
w=dfs(y,min(e[i].z,f-tmp));
if(!w) d[y]=-;e[i].z-=w;
e[i^].z+=w;tmp+=w;
if(e[i].z>) cur[x]=i;
if(tmp==f) return f;
} return tmp;
} void solve(){
while(bfs()){cpy();tot+=dfs(S,inf);}
} int main(){
scanf("%d",&n);int TT=n+,SS=;
for(int i=,y,x;i<n;i++){
scanf("%d%d",&x,&y),x++,y++;
t[y]++;t[x]--;add(x,y,inf);
} S=n+;T=S+;
for(int i=;i<=n;i++)
add(SS,i,inf),add(i,TT,inf);
for(int i=;i<=n;i++)
if(t[i]>) add(S,i,t[i]);
else if(t[i]<) add(i,T,-t[i]);
solve();add(TT,SS,inf);solve();
printf("%d\n",e[c].z);return ;
}

最小流

BZOJ 4464 旅行时的困惑 最小流的更多相关文章

  1. 「JSOI2013」旅行时的困惑

    「JSOI2013」旅行时的困惑 传送门 由于我们的图不仅是一个 \(\text{DAG}\) 而且在形态上还是一棵树,也就是说我们为了实现节点之间互相可达,就必须把每条边都覆盖一次,因为两个点之间的 ...

  2. bzoj 4464 : [Jsoi2013]旅行时的困惑

    网络流建图. 从S向每个点连边,从每个点向T连边. 每条树边反向连一条下界为1,上界inf的边. 跑最小流. 注意加当前弧优化. #include<cstdio> #include< ...

  3. bzoj 4464: [Jsoi2013]旅行时的困惑【贪心】

    据说正解是有上下界最小流,但是这种1e5的玩意问什么要跑网络流啊-- 贪心即可,注意一点是可以有多条路径经过一条边-- 以1为根,设d[u][0/1]为u到父亲的边是向下/向上,g记录这个点儿子中不能 ...

  4. BZOJ 2502 Luogu P4843 清理雪道 最小流

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

  5. BZOJ 1458 / Luogu P4311 士兵占领 (上下界最小流 / 直接最大流)

    做法1:上下界最小流 先来一发上下界最小流,思路比较暴力,就是把行和列看作n+mn+mn+m个点,(i,j)(i,j)(i,j)如果能占领就从第iii行向第jjj列连一条边,上界为1下界为0;然后从s ...

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

    [题意] 有一个DAG,要求每条边必须经过一次,求最少经过次数. [思路] 有上下界的最小流.  边的下界为1,上界为无穷.构造可行流模型,先不加ts边跑一遍最大流,然后加上t->s的inf边跑 ...

  7. BZOJ 2502: 清理雪道 [最小流]

    2502: 清理雪道 题意:任意点出发任意次每条边至少经过一次最小花费. 下界1,裸最小流.... #include <iostream> #include <cstdio> ...

  8. bzoj 4200: [Noi2015]小园丁与老司机【dp+有上下界最小流】

    洛谷上有个点死活卡不过去,不知道是哪里写丑了orz 参考:https://www.cnblogs.com/ditoly/p/BZOJ4200.html 从上往下dp,设f为不向左右走直接上去的值,g为 ...

  9. bzoj 2502: 清理雪道【有上下界有源汇最小流】

    对于原有边,流区间是(1,inf),按着原边连,然后再连(s,i,(0,inf)),(i,t,(0,inf))表示任意位置进出雪场 按着这个建出新图 然后最小流的方法是先跑可行流,设ans为(t,s, ...

随机推荐

  1. tar 报错gzip: stdin: not in gzip format(转载)

    转自:http://blog.sina.com.cn/s/blog_6f2274fb0100z026.html 今天在linux下 用tar -zxf xxx.tar.bz2 然后就报这个错. gzi ...

  2. bzoj 3930: [CQOI2015]选数【递推】

    妙啊 这个题一上来就想的是莫比乌斯反演: \[ f(d)=\sum_{k=1}^{\left \lceil \frac{r}{d} \right \rceil}\mu(k)(\left \lceil ...

  3. Django models模型

    Django models模型 一. 所谓Django models模型,是指的对数据库的抽象模型,models在英文中的意思是模型,模板的意思,在这里的意思是通过models,将数据库的借口抽象成p ...

  4. 【数据结构(C语言版)系列二】 栈

    栈和队列是两种重要的线性结构.从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构.但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型. 栈的定 ...

  5. how-to-fix-fs-re-evaluating-native-module-sources-is-not-supported-graceful

    http://stackoverflow.com/questions/37346512/how-to-fix-fs-re-evaluating-native-module-sources-is-not ...

  6. ORACLE数据库的备份分为物理备份和逻辑备份两种。

    物理备份是将实际组成数据库的操作系统文件从一处拷贝到另一处的备份过程,通常是从磁盘到磁带.可以使用 Oracle 的恢复管理器(Recovery Manager,RMAN)或操作系统命令进行数据库的物 ...

  7. VGG16 pre-trained model 实现 image classification

    站在巨人的肩膀上!使用VGG预先训练好的weight来,进行自己的分类. 下一阶段是在这上面进行自己的修改,完成自己想要的功能. Github源码 Github上有我全部的工程代码. 环境配置 Pyt ...

  8. 227 Basic Calculator II 基本计算器II

    实现一个基本的计算器来计算一个简单的字符串表达式. 字符串表达式仅包含非负整数,+, - ,*,/四种运算符和空格 . 整数除法仅保留整数部分. 你可以假定所给定的表达式总是有效的. 一些例子: &q ...

  9. 206 Reverse Linked List 反转链表

    反转一个单链表.进阶:链表可以迭代或递归地反转.你能否两个都实现一遍?详见:https://leetcode.com/problems/reverse-linked-list/description/ ...

  10. Oracle中的表空间

    表空间是什么? Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构是指构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念及它们之间的关系. 表空间是数据库数据 ...