[BZOJ2502]清理雪道
试题描述
从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向。
你的团队负责每周定时清理雪道。你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部。从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道。
由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务。
输入
输入文件的第一行包含一个整数n (2 <= n <= 100) – 代表滑雪场的地点的数量。接下来的n行,描述1~n号地点出发的斜坡,第i行的第一个数为mi (0 <= mi < n) ,后面共有mi个整数,由空格隔开,每个整数aij互不相同,代表从地点i下降到地点aij的斜坡。每个地点至少有一个斜坡与之相连。
输出
输出文件的第一行是一个整数
k – 直升飞机的最少飞行次数。
输入示例
81 31 72 4 51 81 802 6 50
输出示例
数据规模及约定
见“输入”
题解
最小费用流。从源点向入度为 0 的点连容量无穷费用为 0 的有向边,从出度为 0 的点向汇点连容量无穷费用为 0 的有向边;然后对于这张 DAG 的每条有向边,拆分成两条同方向的有向边,一条容量为 1 费用负无穷,另一条容量无穷费用为 0. 因为我们需要强制每条边至少经过一次,所以要将其中一条的费用设成负无穷。
跑一边最小费用流(注意不是最大流)即可。
#include #include #include #include #include #include #include #include #include #include