题目链接:点击查看

题目大意:给出一张n个点m条边的无向图,一些恐怖分子要从点st到点ed去安装炸弹,为了阻止他们这样做,必须在某些点布置警察,只要恐怖分子路过警察所在的点就会被逮捕,在某个点布置警察的花费是val[i],现在要求阻止恐怖分子的行动所需要的最小花费

题目分析:转换一下题意,就是从起点st到终点ed,每个点都有一个点权,现在若想将st和ed分离到两个集合中,问删除点的点权和最小是多少,这样一来就转换成了最小割的问题,但并不是裸的问题,最小割问题是要删除边,将一张图分为两个集合,以达到边权之和最小,那么对于这个题目而言,我们只需要拆点就好了,将每两个点拆成入点和出点,我们记为x和xx,1~n为入点,n+1~2*n为出点,则按照下面方式建边:

  1. x->xx,边权为点权
  2. u+n->v,边权为无穷大
  3. v+n->u,边权为无穷大

这样建好边后,直接跑最大流就好了,此时需要从起点的入点跑到终点的出点,也就是st到ed+n

这里需要注意一下,对于二分图问题,dinic不加弧优化比加了弧优化要快不少,原理不明,反向优化?

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1000;struct Edge
{int to,w,next;
}edge[N*N];//边数int head[N],cnt;void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;//反向边边权设置为0edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],now[N*N];//深度 当前弧优化bool bfs(int s,int t)//寻找增广路
{memset(d,0,sizeof(d));queue<int>q;q.push(s);now[s]=head[s];d[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v])continue;if(!w)continue;d[v]=d[u]+1;now[v]=head[v];q.push(v);if(v==t)return true;}}return false;
}int dinic(int x,int t,int flow)//更新答案
{if(x==t)return flow;int rest=flow,i;for(i=now[x];i!=-1&&rest;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(w&&d[v]==d[x]+1){int k=dinic(v,t,min(rest,w));if(!k)d[v]=0;edge[i].w-=k;edge[i^1].w+=k;rest-=k;}}now[x]=i;return flow-rest;
}void init()
{memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0,flow;while(bfs(st,ed))while(flow=dinic(st,ed,inf))ans+=flow;return ans;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n,m;while(scanf("%d%d",&n,&m)!=EOF){init();int st,ed;scanf("%d%d",&st,&ed);for(int i=1;i<=n;i++){int val;scanf("%d",&val);addedge(i,i+n,val);}for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);addedge(u+n,v,inf);addedge(v+n,u,inf);}printf("%d\n",solve(st,ed+n));}return 0;
}

HDU - 4289 Control(最小割-最大流)相关推荐

  1. hdu 4289(最小割最大流定理)

    题意:有N个城市,现在城市S出现了一伙歹徒,他们想运送一些炸弹到D城市,不过警方已经得到了线报知道他们的事情,不过警察不知道他们所在的具体位置,所以只能采取封锁城市的办法来阻断暴徒,不过封锁城市是需要 ...

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

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

  3. HDU-1569 方格取数(2) 最小割最大流

    题义很简单,还记得方格取数(1)的时候,使用状态压缩写的,这里由于行列数太大,因此无法进行压缩.所以要运用的最小割最大流的思想来解这道题. 大概是这样分析的,题义是要我们求在一个方格内取出N个点,使得 ...

  4. Destroying The Graph 最小点权集--最小割--最大流

    Destroying The Graph 构图思路: 1.将所有顶点v拆成两个点, v1,v2 2.源点S与v1连边,容量为 W- 3.v2与汇点连边,容量为 W+ 4.对图中原边( a, b ), ...

  5. 图像分割经典算法--《最小割最大流》(Minimum Cut——Max Flow)

    1.算法介绍 最小割算法(Minimum Cut)是图像分割的经典算法之一,同时也在"Graph Cut"."Grab Cut"等算法中都有被使用过.最小割最大 ...

  6. HDU - 5889 Barricade(最短路+最小割-最大流)

    题目链接:点击查看 题目大意:给出一张无向图,每条边的长度为1,第i条边建立障碍的花费为wi,题目要求在保证从1到n号点的所有的最短路径上,都有障碍的情况下的最小费用 题目分析:要求最短路上的最小割, ...

  7. hdu 3046(最小割最大流)

    题意:在一个单位方格边长为1的矩阵中藏着灰太狼和它的同伴,等待着喜羊羊和它的同伴,为了不让喜羊羊和同伴被抓住,我们可以在矩形草坪中设置单位长度为1的栅栏,求最短的栅栏长度. 解题思路:这道题是要把狼和 ...

  8. HDU 4859 海岸线 最小割

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 题解: 这题考察的是最小割. 我们可以这样想:海岸线的长短变化都是E引起的,我们通过把'E'变 ...

  9. UVA - 10480 Sabotage(最小割-最大流+输出割边)

    题目链接:点击查看 题目大意:给出一张无向图,1为起点,2为终点,删除每条边都需要权值wi,题目需要求将起点与终点分割为两个部分的最小花费,并且输出方案 题目分析:如果不让输出方案的话就是一个裸的最大 ...

最新文章

  1. spring boot jpa 整合
  2. windows如何卸载Oracle
  3. 图论--欧拉回路--弗罗莱算法模板
  4. 计算机网络安全基础知识笔记
  5. SQL Sever sa密码丢失
  6. hdu 2476 区间dp
  7. Parhaps you are running on a JRE rather than a JDK?
  8. 【leetcode】Majority Element
  9. spark算子_Spark算子总结
  10. 电大计算机dm编写程序,渭南电大计算机应用基础网考答题过程介绍
  11. Adobe 全家桶关闭自动更新?技巧来啦!
  12. 编写Linux Shell脚本的最佳实践
  13. 哈理工OJ 1151 追求(斐波那契变形【思维题目】)
  14. android 铃音制作工具,手机铃声制作大师
  15. 小米手机抢购背后的摩尔定律
  16. Linux下写盘速度测试程序,Linux下硬盘读写速度测试
  17. strlen函数原理
  18. vue简单实现多功能弹幕(比上一个好)
  19. 01-空投Lynda
  20. DB2 MERGE INTO的使用

热门文章

  1. 基于@Bean声明lazy-queue
  2. 高仿真的类-DefaultListableBeanFactory
  3. Hive的基本操作-分组和多表连接
  4. 权限操作-springSecurity快速入门-使用自定义页面
  5. POI的入门:单元格样式处理
  6. MySQL常用存储引擎之Federated
  7. C语言与Java怎么沟通_c语言初学指针,对于java面向对象的初理解
  8. Linux读写执行(RWX)权限
  9. 在js中如何判断一个对象是否为空
  10. 我的前端工具集(四)树状结构后篇