Air Raid

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4591    Accepted Submission(s):
3072

Problem Description
Consider a town where all the streets are one-way and
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.

 
Input
Your program should read sets of data. The first line
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.

 
Output
The result of the program is on standard output. For
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.
 
Sample Input
2
4
3
3 4
1 3
2 3
3
3
1 3
1 2
2 3
 
Sample Output
2
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最小路径覆盖的更多相关文章

  1. 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)

    [题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何一 ...

  2. (hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把全部的顶点都覆盖)

    题目: Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  3. HDU1151 Air Raid —— 最小路径覆盖

    题目链接:https://vjudge.net/problem/HDU-1151 Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory L ...

  4. (step6.3.4)hdu 1151(Air Raid——最小路径覆盖)

    题意:     一个镇里所有的路都是单向路且不会组成回路. 派一些伞兵去那个镇里,要到达所有的路口,有一些或者没有伞兵可以不去那些路口,只要其他人能完成这个任务.每个在一个路口着陆了的伞兵可以沿着街去 ...

  5. hdu 1151 Air Raid 最小路径覆盖

    题意:一个城镇有n个路口,m条路.每条路单向,且路无环.现在派遣伞兵去巡逻所有路口,伞兵只能沿着路走,且每个伞兵经过的路口不重合.求最少派遣的伞兵数量. 建图之后的就转化成邮箱无环图的最小路径覆盖问题 ...

  6. POJ 1422 Air Raid (最小路径覆盖)

    题意 给定一个有向图,在这个图上的某些点上放伞兵,可以使伞兵可以走到图上所有的点.且每个点只被一个伞兵走一次.问至少放多少伞兵. 思路 裸的最小路径覆盖. °最小路径覆盖 [路径覆盖]在一个有向图G( ...

  7. Air Raid(最小路径覆盖)

    Air Raid Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7511   Accepted: 4471 Descript ...

  8. LibreOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题

    #6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  9. LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图

    #6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

随机推荐

  1. FireDac 的数据库批量语句提交(高效)

    FD 提供了批量执行功能, 称为 Array DML. 可以这么做: FDQuery1.SQL.Text := 'insert into MyTab values (:p1, :p2, :p3)'; ...

  2. 【secureCRT】永久设置背景色和文字颜色

  3. 对EJB返回的AaaryList显示到table的处理方法

      1. ArrayList --> Object[]        ArrayList x = new ArrayList();        int i = x.size();        ...

  4. ctl 里面pdef解说

    WRF 模式MM5 模式都是目前从网上可以下载的气象软件,因此在国内经常可以见到.但这两种模式的数据特点数据的水平网格都不是标准的经纬度网格.需要在ctl 文件中加入PDEF 定义说明把这种非标准的数 ...

  5. HDU 1520:Anniversary party(树形DP)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Problem Description   There i ...

  6. 《Linux/Unix系统编程手册》

    TCP的TIME_WAIT状态,超时时间为2倍MSL(IP报文超过TTL前最大生存时间,BSD规范为30s,RFC1122建议为2分钟).

  7. android中广告轮播图总结

    功能点:无限轮播.指示点跟随.点击响应.实现思路: 1.指示点跟随,指示点通过代码动态添加,数量由图片数量决定. 在viewpager的页面改变监听中,设置点的状态选择器enable,当前页时,set ...

  8. [充电][ios]ios充电接口

    知乎推荐:http://www.zhihu.com/topic/19693633/top-answers 外文教学网站: http://www.raywenderlich.com/ 著作权归作者所有. ...

  9. python :生产者和消费者模型 即简单的协程

    def consumer(name): print('%s开始准备吃包子了' %name) while True: baozi=yield print('[%s]包子来了,被[%s]吃了' %(bao ...

  10. java中+的使用

    在java中+可以做为连接符和运算符两种使用方法 例如: 代码: int X=100; int Y=200; System.out.println("X+Y="  +  (X +  ...