传送门:【HDU】4411 Arrest

题目分析:题目的意思一开始没看懂= =。。。题意大致为:派出至多K个警队遵守先灭小的再灭老的的原则将N个城市的帮派全端了(要灭编号大的必须要先灭编号小的)。且一个警队可以一次端多个城市。

首先floyd预处理出所有点对之间的最短路,题目保证两点之间一定可达。令G[i][j]为i到j的最短路。

题目要求的必须先灭i才能灭i+1总可以通过合理的警队剿灭顺序做到(比如警队1灭了帮派1,警队2灭了帮派2然后回家,然后警队1再灭了帮派3再回家)。于是本题转化成K路径覆盖问题。首先每个点都必须被走到,那么将一个点 i 拆成两个点i、i+n,然后建边( i , i + n , 1 , -M ),其中M为比最大的路径长度还大的一个数,目的是为了一定将点i取到,这里设为100000(100000>99*1000)。容量为1表示只能被剿灭一次。

然后设立源点s,汇点t,源点向0建边( s , 0 , K , 0 )表示至多能派K个警队。0向1~n建边( 0 , i , 1 , G[ 0 ][ i ] )表示一支警队从0出发到i(为什么容量设为1?因为只用一支警队去剿灭帮派i,而且如果有别的警队要去剿灭别的帮派必须要经过i的话,那么最短路上其实已经算上0~i的最短路了,所以没必要重复添加,并且正好和上面的建图对应)。

1~n向汇点建边( i + n , t , 1 , G[ i ][ 0 ] )表示警队抓完帮派i回家(0)了。

然后对所有的点i,向所有的j( j > i )建边( i + n , j , 1 , G[ i ][ j ] )表示抓完帮派i要去抓帮派j了(因为只能抓了小的才能抓大的,所以只能是小的向大的建边)。

最后,由于当费用最小的时候并不是最大流(不是所有的警察都一定要用到),所以建边( 0 , t , K , 0 )表示用不到的警察直接不出门了。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;#define REP( i , a , b ) for ( int i = ( a ) ; i <  ( b ) ; ++ i )
#define FOR( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define REV( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; -- i )
#define travel( e , H , u ) for ( Edge* e = H[u] ; e ; e = e -> next )
#define CLR( a , x ) memset ( a , x , sizeof a )
#define cPY( a , x ) memcpy ( a , x , sizeof a )const int M = 100000 ;
const int MAXN = 205 ;
const int MAXE = 20000 ;
const int INF = 0x3f3f3f3f ;struct Edge {int v , c , w , n ;Edge () {}Edge ( int v , int c , int w , int n ) : v ( v ) , c ( c ) , w ( w ) , n ( n ) {}
} ;struct Net {Edge E[MAXE] ;int H[MAXN] , cntE ;int d[MAXN] , cap[MAXN] , cur[MAXN] ;int Q[MAXN] , head , tail ;bool vis[MAXN] ;int s , t ;int flow , cost ;int n , m , K ;int G[105][105] ;void init () {cntE = 0 ;CLR ( H , -1 ) ;}void addedge ( int u , int v , int c , int w ) {E[cntE] = Edge ( v , c ,  w , H[u] ) ;H[u] = cntE ++ ;E[cntE] = Edge ( u , 0 , -w , H[v] ) ;H[v] = cntE ++ ;}bool spfa () {CLR ( d , INF ) ;CLR ( vis , 0 ) ;head = tail = 0 ;cap[s] = INF ;cur[s] = -1 ;d[s] = 0 ;Q[tail ++] = s ;while ( head != tail ) {int u = Q[head ++] ;if ( head == MAXN ) head = 0 ;vis[u] = 0 ;for ( int i = H[u] ; ~i ; i = E[i].n ) {int v = E[i].v , c = E[i].c , w = E[i].w ;if ( c && d[v] > d[u] + w ) {d[v] = d[u] + w ;cap[v] = min ( c , cap[u] ) ;cur[v] = i ;if ( !vis[v] ) {vis[v] = 1 ;if ( d[v] < d[Q[head]] ) {if ( head == 0 ) head = MAXN ;Q[-- head] = v ;} else {Q[tail ++] = v ;if ( tail == MAXN ) tail = 0 ;}}}}}if ( d[t] == INF ) return 0 ;flow += cap[t] ;cost += cap[t] * d[t] ;for ( int i = cur[t] ; ~i ; i = cur[E[i ^ 1].v] ) {E[i].c -= cap[t] ;E[i ^ 1].c += cap[t] ;}return 1 ;}int MCMF () {flow = cost = 0 ;while ( spfa () ) ;return cost ;}void solve () {int u , v , c , w ;init () ;CLR ( G , INF ) ;s = n << 1 | 1 ;t = s + 1 ;while ( m -- ) {scanf ( "%d%d%d" , &u , &v , &w ) ;G[u][v] = G[v][u] = min ( G[u][v] , w ) ;}FOR ( k , 0 , n ) FOR ( i , 0 , n ) FOR ( j , 0 , n ) G[i][j] = min ( G[i][j] , G[i][k] + G[k][j] ) ;FOR ( i , 1 , n ) addedge ( i , i + n , 1 , -M ) ;FOR ( i , 1 , n ) addedge ( 0 , i , 1 , G[0][i] ) ;FOR ( i , 1 , n ) addedge ( i + n , t , 1 , G[i][0] ) ;FOR ( i , 1 , n ) FOR ( j , i + 1 , n ) addedge ( i + n , j , 1 , G[i][j] ) ;addedge ( s , 0 , K , 0 ) ;addedge ( 0 , t , K , 0 ) ;printf ( "%d\n" , MCMF () + M * n ) ;}
} e ;int main () {while ( ~scanf ( "%d%d%d" , &e.n , &e.m , &e.K ) && ( e.n || e.m || e.K ) ) e.solve () ;return 0 ;
}

【HDU】4411 Arrest 费用流相关推荐

  1. HDU 4411 Arrest 费用流

    题目描述: Description There are (N+1) cities on TAT island. City 0 is where police headquarter located. ...

  2. hdu 4411 Arrest 费用流模板

    题意:警察局在0点,里面有k个警察,要将1-n的贼窝一网打尽,这1+n个点都有距离,且要求抓 i 点的贼前保证已经抓光 比i小的贼.警察们最后要回到0点,问满足抓到所以的贼(题目保证可行)最少走的路之 ...

  3. hdu4411 Arrest(费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4411 [题意]给定N+1个点,距离,K个人,问,每人从0开始按照升序访问节点然后回到0,每个节点被访问 ...

  4. HDU 4411 Arrest(费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4411 题意:有n+1个城市,编号0到n.其中警察局在0号城市,1到n号城市中每个城市都有一个小偷.现在 ...

  5. hdu 4322 最大费用流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4322 #include <cstdio> #include <cstring> ...

  6. HDU 4411 Arrest

    http://www.cnblogs.com/jianglangcaijin/archive/2012/09/24/2700509.html 思路: S->0 流量为K费用0 0->i 流 ...

  7. HDU 4411 Arrest 最小费用流

    题意:有N+1个顶点M条边的无向图.编号为0的顶点是警察厅.编号为1~N的顶点都有犯罪团伙.现在警察厅需要派出K支小队抓住这些犯罪团伙,第i个点的犯罪团伙被抓到之后会马上通知第i-1个犯罪团伙.现要求 ...

  8. hdu 4411 Arrest【最小费用流】

    题目链接 题意: 给定一个有(n+1)个节点的边权图,其中警察局在0点,其他n个点各有一个黑手党,现在警察局派出k个警察去抓黑手党,并逮捕会警察局,一旦黑手党i被抓,他会向黑手党i-1报信,任务就会失 ...

  9. 网络流 最大流 最小割 费用流

    [腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...

最新文章

  1. mysql 表引擎无法更新_Mysql安装archive引擎更新表引擎
  2. python表格控件_python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例...
  3. 扩展 日历_2021少林日历 | 以最美的方式记录时光
  4. 学写jQuery插件开发方法
  5. python网络爬虫的基本步骤-十分钟教会你用Python写网络爬虫程序
  6. pandas 补充知识:data_range函数
  7. 体验XHProf(linux版本)
  8. 工作161:eachart渲染步骤
  9. 解决为什么导入了tomcat进入myeclipse却在server中找不到
  10. jq之$(“ul li:first-child“)
  11. 转载牛人的ASP.NET Cookies简单应用 记住用户名和密码
  12. asp.net 打印控件之报表
  13. 集成电路模拟版图入门-版图基础学习笔记(六)
  14. CSDN情感倾向分析API——功能测试——全流程演示
  15. SAP系统接口对接历险记
  16. python金融数据分析单元测试答案_参考答案2020智慧树知到Python金融数据分析
  17. chrome如何分析页面加载时间
  18. 有道云笔记快捷键用法(加自己的补充)
  19. xls/csv文件转换成dbf文件
  20. 风投大亨蒂尔对神秘大数据公司Palantir估值折价40%

热门文章

  1. Translatium for Mac 8.2.1 Google翻译 实时翻译 破解版下载
  2. DeepMind 发了篇论文,把我看笑了
  3. MSP430定时器综合试验
  4. 记录看到的crash相关的好网页
  5. Unity 编辑器开发实战【Editor Window】- BlendShape调试工具
  6. 对支持Linux系统的软件加密狗调研
  7. 新浪博客的等级、积分的规则_我是亲民_新浪博客
  8. 从信息化改造到数字化转型,中国企业行至何处?
  9. SpringMVC项目中HTML页面中引入js
  10. 虾皮跨境店和本土店的区别是什么—扬帆牧哲