题目大意

监狱有N条道路连接N + 1个交点,编号0至N,整个监狱被这些道路连在一起(任何2点之间都有道路),人们通过道路在交点之间走来走去。其中的一些交点只有一条路连接,这些点是监狱的出口。在各个交点中有M个点住着犯人(M <= N + 1),剩下的点可以安排警卫,有警卫把守的地方犯人无法通过。给出整个监狱的道路情况,以及犯人所在的位置,问至少需要安排多少个警卫,才能保证没有1个犯人能够逃到出口,如果总有犯人能够逃出去,输出-1。

分析

在olahiuj的安利下做了这题。
正解应该是树形dp之类的东东。。。
但是我们也可以用最小割写。。。(不知为何10^5的数据dinic居然能过)

建图:
1.如果i和j有边相连(i,j’,∞)(j,i’,∞)
2.如果i有犯人(s,i,∞)
3.如果i是出口(i,t,∞)
4.把i点拆成入点和出点(i’,i,1)

code

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>using namespace std;struct arr{int x,y,w,next;
}edge[2000000];int ls[410000],cur[410000];
int f[2100000];
int edge_m=1;
int n,m,s,t;
int ans,num=0;void add(int x,int y,int w)
{edge[++edge_m]=(arr){x,y,w,ls[x]}; cur[y]=ls[x]=edge_m; f[edge_m]=w;edge[++edge_m]=(arr){y,x,w,ls[y]}; cur[y]=ls[y]=edge_m; f[edge_m]=0;
}int dis[400000];bool bfs()
{memset(dis,-1,sizeof(dis));queue<int> q;q.push(s);dis[s]=0;do{int x=q.front();q.pop();for (int i=ls[x];i!=0;i=edge[i].next){if ((f[i])&&(dis[edge[i].y]==-1)){dis[edge[i].y]=dis[x]+1;q.push(edge[i].y);if (edge[i].y==t) return true;}}}while (!q.empty());return false;
}int find(int x,int min_)
{if (x==t) return min_;int rec=min_;for (int &i=cur[x];i!=0;i=edge[i].next){if ((f[i])&&(dis[edge[i].y]==dis[x]+1)){int k=find(edge[i].y,min(min_,f[i]));f[i]-=k;f[i^1]+=k;rec-=k;if (rec==0) return min_;}}if (rec==min_) dis[x]=-1;return min_-rec;
}int dinic()
{ans=0;while (bfs()){for (int i=0;i<=t;i++) cur[i]=ls[i];ans+=find(s,20000000);}
}int a[410000];
int du[410000];int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){int x,y;scanf("%d%d",&x,&y);du[x]++; du[y]++;add(x,y+n+1,410000);add(y,x+n+1,410000);}for (int i=1;i<=m;i++){int x;scanf("%d",&x);a[x]=1;}n++;s=n*2+1; t=n*2+2;for (int i=0;i<=n;i++){if (a[i]) add(s,i,410000);else add(i+n,i,1);if (du[i]==1) add(i,t,410000);}dinic();if (ans==410000) printf("-1");else printf("%d",ans);
}

监狱逃离 51nod1299 最小割相关推荐

  1. [51nod1299] 监狱逃离(最小点覆盖)

    题目链接:https://www.51nod.com/contest/problem.html#!problemId=1299 题意:中文题面. 挺容易想到最小点覆盖的,这么想题目的意思就是希望找到几 ...

  2. 51nod1299 监狱逃离 最小割

    Description 监狱有N条道路连接N + 1个交点,编号0至N,整个监狱被这些道路连在一起(任何2点之间都有道路),人们通过道路在交点之间走来走去.其中的一些交点只有一条路连接,这些点是监狱的 ...

  3. 51nod 1299 监狱逃离 树形dp/最小割

    题意:监狱有N条道路连接N + 1个交点,编号0至N,整个监狱被这些道路连在一起(任何2点之间都有道路),人们通过道路在交点之间走来走去.其中的一些交点只有一条路连接,这些点是监狱的出口.在各个交点中 ...

  4. [51nod1299]监狱逃离

    Description 给出一个n+1个点n条边的树,其中每一个度数为1的点为出口. 现在有一些点有逃犯,你需要在一些没有逃犯的点放置警卫,有警卫的点逃犯无法经过. 求若使所有逃犯均无法到达出口,最少 ...

  5. 51nod-1299 监狱逃离(贪心)

    1299 监狱逃离 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题  收藏  关注 监狱有N条道路连接N + 1个交点,编号0至N, ...

  6. 51nod 1299 监狱逃离 树形dp

    题意 监狱有N条道路连接N + 1个交点,编号0至N,整个监狱被这些道路连在一起(任何2点之间都有道路),人们通过道路在交点之间走来走去.其中的一些交点只有一条路连接,这些点是监狱的出口.在各个交点中 ...

  7. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  8. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  9. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

最新文章

  1. 2018.5.29 Oracle连接到空闲例程
  2. python使用matplotlib可视化、查看matplotlib可视化中不同字体形式、不同字号、斜体可视化的效果对比
  3. HBase搭建完全分布式环境
  4. SOAP:简单对象访问协议
  5. 字符串的排序不一定要完全按照字典序(洛谷P1012题题解,Java语言描述)
  6. Bootstrap HTML 编码规范之IE兼容模式
  7. Oracle物化视图的创建及使用(一
  8. saas系统是什么_为什么SAAS食堂管理系统更受人们的欢迎?
  9. NTOJ-14-会场安排问题(贪心算法)
  10. 13个免费的开源GIS软件
  11. 美团相关的scheme
  12. 如何修改C:\Windows\System32\drivers\etc\hosts文件
  13. (亲测有效)荣耀手机一键激活Xposed框架方法
  14. python输入班级姓名_python,寻找班级里面名字最长的人
  15. Android 获取当前系统语言和切换系统语言
  16. 如何在工作中保持专注力
  17. pic16多路adc采样
  18. 一种靠加热内部空间达到超光速飞行的机器
  19. ds服务器没检测到有响应,设备或资源dns没检测到有响应 网络无法连接
  20. 奇虎360安全卫士推出木马程序查杀功能

热门文章

  1. 如何设置每天服务器定时重启?
  2. 【交互设计】七步打造手机网站
  3. 文秘要学计算机吗,高考志愿:计算机专业和文秘专业哪个适合女生?
  4. linode购买服务器
  5. Tableau实现跑道图
  6. CSI笔记【8】:基于MUSIC Algorithm的DoA/AoA估计以及MATLAB实现
  7. 程序员的十层楼,比尔盖茨仅第四层,你能到第几层?
  8. MapReduce稍微高级编程之PageRank算法的实现
  9. c语言macro pdf,C语言的宏macro的使用
  10. 基于Android Q电池服务分析