【网络流24题----03】Air Raid最小路径覆盖
Air Raid
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4591 Accepted Submission(s):
3072
each street leads from one intersection to another. It is also known that
starting from an intersection and walking through town's streets you can never
reach the same intersection i.e. the town's streets form no cycles.
With
these assumptions your task is to write a program that finds the minimum number
of paratroopers that can descend on the town and visit all the intersections of
this town in such a way that more than one paratrooper visits no intersection.
Each paratrooper lands at an intersection and can visit other intersections
following the town streets. There are no restrictions about the starting
intersection for each paratrooper.
of the input file contains the number of the data sets. Each data set specifies
the structure of a town and has the
format:
no_of_intersections
no_of_streets
S1 E1
S2
E2
......
Sno_of_streets Eno_of_streets
The first line of each data
set contains a positive integer no_of_intersections (greater than 0 and less or
equal to 120), which is the number of intersections in the town. The second line
contains a positive integer no_of_streets, which is the number of streets in the
town. The next no_of_streets lines, one for each street in the town, are
randomly ordered and represent the town's streets. The line corresponding to
street k (k <= no_of_streets) consists of two positive integers, separated by
one blank: Sk (1 <= Sk <= no_of_intersections) - the number of the
intersection that is the start of the street, and Ek (1 <= Ek <=
no_of_intersections) - the number of the intersection that is the end of the
street. Intersections are represented by integers from 1 to
no_of_intersections.
There are no blank lines between consecutive sets of
data. Input data are correct.
each input data set the program prints on a single line, starting from the
beginning of the line, one integer: the minimum number of paratroopers required
to visit all the intersections in the town.
4
3
3 4
1 3
2 3
3
3
1 3
1 2
2 3
1
一个城镇中有n个路口和m条单项的路径,图是无环图。
有一些伞兵可以从任意一个路口出发,要求走不相交的路径并到达所有的路口;
我们的任务就是求出最少要几个伞兵。
那么很显然就是最小路径覆盖问题了(什么你不会最小路径覆盖?)
样例:
4 3
1 3
2 3
3 4
图一(样例)

然后:有向图的最小路径覆盖=V-二分图最大匹配。
代码:我依旧跑的是dinic
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cstring>
#define yyj(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout);
#define llg long long
#define maxn 2000
llg j,k,n,m,y,z,bj[maxn],head,tail,dl[maxn],deep[maxn],ans;
bool f,ff;
using namespace std;
vector <llg> a[maxn],v[maxn],ba[maxn];
//a[i][j]表示第i个点所指向的第j个点是a[i][j],v[i][j]表示权值(流量),ba[i][j]表示a[i][j]的反xiangbian
llg dfs(llg x,llg low)
{
llg res=;llg va=;
if (x==n) {return low;}
llg w=a[x].size();
for (llg i=;i<w;i++)
if (deep[x]+==deep[a[x][i]] && v[x][i]> && (va=dfs(a[x][i],min(low,v[x][i]))))
{
v[x][i]-=va; v[a[x][i]][ba[x][i]]+=va;
return va;
}
return ;
}
void fencen()
{
memset(bj,,sizeof(bj));
tail=; head=; dl[]=; bj[]=;
do{
head++;
llg x=dl[head];
llg w=a[x].size();
for (llg i=;i<w;i++)
if (!bj[a[x][i]] && v[x][i]>)
{
tail++; dl[tail]=a[x][i];
deep[a[x][i]]=deep[x]+;
bj[a[x][i]]=;
}
}while (head!=tail);
}
void insert(llg x,llg y,llg z)
{
a[x].push_back(y); v[x].push_back(z);
a[y].push_back(x); v[y].push_back();
ba[x].push_back(a[y].size()-); ba[y].push_back(a[x].size()-);
}
int main()
{
yyj("a");
cin>>n>>m; deep[]=;
for (llg i=;i<=m;i++)
{
llg x;
cin>>x>>y;
insert(x*-,y*,); insert(x*,y*-,);
}
for (llg i=;i<=n;i++)
{
insert(,i*-,); insert(i*-,,);
insert(i*,n*+,); insert(n*+,i*,);
}
llg total=n;
n=n*+;
while ()
{
f=true; ff=false;
fencen();
if (!bj[n]) break;
ans+=dfs(,0x7fffffff);
}
cout<<total-ans<<endl;
return ;
}
再说几句:
还记得题干中打了红色标记的地方吧!“不相交的路径”
要是可以相交呢?那我们就要跑一遍floyed闭包传递了。
什么你搞不清很清粗为什么要这样?(自己去看一看http://www.cnblogs.com/ka200812/archive/2011/07/31/2122641.html)
图片来自:http://www.cppblog.com/zhangwangcz/archive/2012/03/30/155686.html
【网络流24题----03】Air Raid最小路径覆盖的更多相关文章
- 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)
[题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何一 ...
- (hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把全部的顶点都覆盖)
题目: Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU1151 Air Raid —— 最小路径覆盖
题目链接:https://vjudge.net/problem/HDU-1151 Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory L ...
- (step6.3.4)hdu 1151(Air Raid——最小路径覆盖)
题意: 一个镇里所有的路都是单向路且不会组成回路. 派一些伞兵去那个镇里,要到达所有的路口,有一些或者没有伞兵可以不去那些路口,只要其他人能完成这个任务.每个在一个路口着陆了的伞兵可以沿着街去 ...
- hdu 1151 Air Raid 最小路径覆盖
题意:一个城镇有n个路口,m条路.每条路单向,且路无环.现在派遣伞兵去巡逻所有路口,伞兵只能沿着路走,且每个伞兵经过的路口不重合.求最少派遣的伞兵数量. 建图之后的就转化成邮箱无环图的最小路径覆盖问题 ...
- POJ 1422 Air Raid (最小路径覆盖)
题意 给定一个有向图,在这个图上的某些点上放伞兵,可以使伞兵可以走到图上所有的点.且每个点只被一个伞兵走一次.问至少放多少伞兵. 思路 裸的最小路径覆盖. °最小路径覆盖 [路径覆盖]在一个有向图G( ...
- Air Raid(最小路径覆盖)
Air Raid Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7511 Accepted: 4471 Descript ...
- LibreOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题
#6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图
#6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
随机推荐
- sql创建删除修改表的基本操作
1 建立表格 在建立好数据库以后,就可以根据储存资料的需求,使用SQL叙述建立所有需要的表格(table).建立表格的设定非常多,以建立"world.city"表格来说,它的叙述会 ...
- 为什么很多人用keepalived来实现redis故障转移
目前,Redis还没有一个类似于MySQL Proxy或Oracle RAC的官方HA方案.Redis作者有一个名为Redis Sentinel的计划 ,据称将会有监控,报警和自动故障转移三大功能,非 ...
- php获取目录中的所有文件名
<?php /** * [php获取目录中的所有文件名] */ //1.先打开要操作的目录,并用一个变量指向它 //打开当前目录下的目录pic下的子目录common. $handler = op ...
- ios tabbar 文字位置
[nav.tabBarItem setTitlePositionAdjustment)];
- php socket 客户端代码
<?php class SendDevAction{ //log日志文件 private $logDevFile = ""; //日志字符串 private $logStr ...
- bianwu | 数据行 | 填写意见
protected void gv1_RowDataBound(object sender, GridViewRowEventArgs e) { //首先判断是否是数据行 if (e.Row.RowT ...
- JavaScript DOM 编程艺术(第2版)读书笔记(4)
案例研究:JavaScript 图片库 改变图片的src属性的两种方式: 1,setAttribute方法是“第1级DOM”的组成部分,它可以设置元素节点的任意属性. 2,element.src = ...
- 训练集(train set) 验证集(validation set) 测试集(test set)
转自:http://www.cnblogs.com/xfzhang/archive/2013/05/24/3096412.html 在有监督(supervise)的机器学习中,数据集常被分成2~3个, ...
- Linux内存模型
http://blog.csdn.net/sunyubo458/article/details/6090946 了解linux的内存模型,或许不能让你大幅度提高编程能力,但是作为一个基本知识点应该熟悉 ...
- Collection的toArray()使用上需要注意的地方
转载:http://llade.iteye.com/blog/199818 Collection在很多情况下需要转换为数组来处理(很多接口方法都使用array作为参数). Collection的toA ...