点击打开链接

题意:从0出发,1~N每个城镇有个小偷,我们要把他们全部抓到,我们可以派出k个警察,但是再抓i城镇的小偷之前,i城镇之前的所有城镇的小偷已经被抓了

思路:哪有什么思路,看了网上的题解,为了将所有的点都跑到,我们将每个点拆成两个点,之间连一条容量为1,费用为-1000000的边,为什么这么连,这是为了保证每个点的跑到的条件,因为最小费用流的增广路径是通过最短路来完成的,这样我的点拆成两个点之间的边加在最短路里肯定是会使路径更短的,这样也就保证了每个点都跑得到,现在说一说建边的方法,建立源点与0连一条容量为k费用为0的边,拆的点i与i+n连一条容量为1,费用为-1000000的边,然后0与汇点建立一条容量为k费用为0的边,这又是为什么呢,据说这些警察可以不全部出动去抓小偷,那他们就直接走这条边就好了,还有我们需要求出两点之间的最短距离,用floyd即可,然后连I到J的边,容量为1,费用为i到j的最短路(I<J),这样在增广时才能保证是从0顺次走到N,最后最小费用流+n*1000000就是结果了,将费用补回来

#include <queue>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=310;
typedef pair<int,int> P;
struct edge{int to,cap,cost,rev;edge();edge(int a,int b,int c,int d){to=a,cap=b,cost=c,rev=d;};
};
vector<edge>G[maxn];
int h[maxn],dis[maxn],prevv[maxn],preve[maxn],V;
void add_edge(int st,int en,int cap,int cost){G[st].push_back(edge(en,cap,cost,G[en].size()));G[en].push_back(edge(st,0,-cost,G[st].size()-1));
}
int min_cost_flow(int st,int en,int f){int ans=0;memset(h,0,sizeof(h));while(f>0){priority_queue<P,vector<P>,greater<P> >que;memset(dis,inf,sizeof(dis));dis[st]=0;que.push(P(0,st));while(!que.empty()){P p=que.top();que.pop();int v=p.second;if(dis[v]<p.first) continue;for(unsigned int i=0;i<G[v].size();i++){edge &e=G[v][i];if(e.cap>0&&dis[e.to]>dis[v]+e.cost+h[v]-h[e.to]){dis[e.to]=dis[v]+e.cost+h[v]-h[e.to];prevv[e.to]=v;preve[e.to]=i;que.push(P(dis[e.to],e.to));}}}if(dis[en]==inf) return -1;for(int i=0;i<maxn;i++) h[i]+=dis[i];int d=f;for(int i=en;i!=st;i=prevv[i]){d=min(d,G[prevv[i]][preve[i]].cap);}f-=d;ans+=d*h[en];for(int i=en;i!=st;i=prevv[i]){edge &e=G[prevv[i]][preve[i]];e.cap-=d;G[i][e.rev].cap+=d;}}return ans;
}
int num[maxn][maxn];
void floyd(){for(int i=0;i<=V;i++){for(int j=0;j<=V;j++){for(int k=0;k<=V;k++)num[j][k]=min(num[j][k],num[j][i]+num[i][k]);}}
}
int main(){int m,k,a,b,c;while(scanf("%d%d%d",&V,&m,&k)!=-1){if(V==0&&m==0&&k==0) break;memset(num,inf,sizeof(num));for(int i=0;i<maxn;i++) G[i].clear();for(int i=0;i<m;i++){scanf("%d%d%d",&a,&b,&c);num[a][b]=num[b][a]=min(num[a][b],c);}floyd();add_edge(2*V+10,0,k,0);add_edge(0,2*V+11,k,0);for(int i=1;i<=V;i++){for(int j=i+1;j<=V;j++){add_edge(i+V,j,1,num[i][j]);}add_edge(0,i,1,num[0][i]);add_edge(i,i+V,1,-1000000);add_edge(i+V,2*V+11,1,num[0][i]);}int ans=min_cost_flow(2*V+10,2*V+11,k);printf("%d\n",ans+V*1000000);}return 0;
}

HDU 4411最小费用流相关推荐

  1. hdu 4411 最小费用流

    思路:主要就是要把一个每个城市拆为两个点,建一条容量为1,费用为-inf的边,保证每个城市都会被遍历. /*最小费用最大流*/ #include<iostream> #include< ...

  2. HDU 4411 Arrest 最小费用流

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

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

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

  4. HDU 4411 Arrest(费用流)

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

  5. HDU 5988 最小费用流

    链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5988 题意: n个点,每个点有a个人和b包饭,m条边,第一次经过这条边没有问题,以后每一个经 ...

  6. HDU 4411 Arrest 费用流

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

  7. HDU 4411 Arrest

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

  8. hdu 4411 Arrest 费用流模板

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

  9. 【HDU】4411 Arrest 费用流

    传送门:[HDU]4411 Arrest 题目分析:题目的意思一开始没看懂= =...题意大致为:派出至多K个警队遵守先灭小的再灭老的的原则将N个城市的帮派全端了(要灭编号大的必须要先灭编号小的).且 ...

最新文章

  1. 排序算法系列:快速排序算法
  2. SAP Spartacus运行时错误 - The pipe cxUrl could not be found!
  3. 两届诺贝尔文学奖得主将同时公布
  4. 如何构建流量无损的在线应用架构 | 专题开篇
  5. 划分子网后的三级结构
  6. UVa101 - The Blocks Problem
  7. Linux下创建、删除软链接
  8. Ubuntu系统安装JDK教程
  9. PHP+HTML简单实现BBS论坛与回帖
  10. java面试题--java基础--迈达斯篇
  11. 思科服务器a设置dns信息,思科怎么配置dns服务器
  12. Android日常整理(一)---android返回键、Fragment、android分割线、button图片间距的设置
  13. 嵌入式学习路径之单片机 | 月薪5个k到5个w的路径全在这了
  14. mybatis 一对一、一对多、多对一、多对多
  15. python如何计算字典平均值_算出字典中数值的平均值
  16. 开发一个app,需要申请哪些,费用是多少?
  17. android 抽屉组件,Android组件之DrawerLayout实现抽屉菜单
  18. LNMP架构搭建(源码编译)
  19. 西北大新生赛:星球大战【切割线定理】
  20. DNS Glue Record 测试、查找

热门文章

  1. 屏幕小于6英寸的手机_6英寸以内的小屏旗舰手机推荐,纯手感无敌!
  2. Linux是 UEFI 还是L启动模式,怎么看系统是UEFI还是Legacy BIOS启动模式
  3. 分数线在计算机上是什么意思,中考录取分数线是什么意思
  4. itext设置字体间距_Word涨薪第五十四式:解决无法调整行间距的情况
  5. 大麦人脸识别系统,如何支撑马拉松赛事?
  6. 外企面试最常见的八大英文问题
  7. DRL:强化学习-Q-Learning算法
  8. 计算机学术英语演讲,学术英语写作与演讲
  9. 华为设备配置VRRP与NQA联动监视上行链路
  10. Python 鸡兔同笼 编程题