监狱逃离 51nod1299 最小割
题目大意
监狱有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 最小割相关推荐
- [51nod1299] 监狱逃离(最小点覆盖)
题目链接:https://www.51nod.com/contest/problem.html#!problemId=1299 题意:中文题面. 挺容易想到最小点覆盖的,这么想题目的意思就是希望找到几 ...
- 51nod1299 监狱逃离 最小割
Description 监狱有N条道路连接N + 1个交点,编号0至N,整个监狱被这些道路连在一起(任何2点之间都有道路),人们通过道路在交点之间走来走去.其中的一些交点只有一条路连接,这些点是监狱的 ...
- 51nod 1299 监狱逃离 树形dp/最小割
题意:监狱有N条道路连接N + 1个交点,编号0至N,整个监狱被这些道路连在一起(任何2点之间都有道路),人们通过道路在交点之间走来走去.其中的一些交点只有一条路连接,这些点是监狱的出口.在各个交点中 ...
- [51nod1299]监狱逃离
Description 给出一个n+1个点n条边的树,其中每一个度数为1的点为出口. 现在有一些点有逃犯,你需要在一些没有逃犯的点放置警卫,有警卫的点逃犯无法经过. 求若使所有逃犯均无法到达出口,最少 ...
- 51nod-1299 监狱逃离(贪心)
1299 监狱逃离 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 监狱有N条道路连接N + 1个交点,编号0至N, ...
- 51nod 1299 监狱逃离 树形dp
题意 监狱有N条道路连接N + 1个交点,编号0至N,整个监狱被这些道路连在一起(任何2点之间都有道路),人们通过道路在交点之间走来走去.其中的一些交点只有一条路连接,这些点是监狱的出口.在各个交点中 ...
- S-T平面图中利用最短路求最小割(BZOJ 1001)
BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...
- [学习笔记]最小割之最小点权覆盖最大点权独立集
最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...
- POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】
题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...
最新文章
- 2018.5.29 Oracle连接到空闲例程
- python使用matplotlib可视化、查看matplotlib可视化中不同字体形式、不同字号、斜体可视化的效果对比
- HBase搭建完全分布式环境
- SOAP:简单对象访问协议
- 字符串的排序不一定要完全按照字典序(洛谷P1012题题解,Java语言描述)
- Bootstrap HTML 编码规范之IE兼容模式
- Oracle物化视图的创建及使用(一
- saas系统是什么_为什么SAAS食堂管理系统更受人们的欢迎?
- NTOJ-14-会场安排问题(贪心算法)
- 13个免费的开源GIS软件
- 美团相关的scheme
- 如何修改C:\Windows\System32\drivers\etc\hosts文件
- (亲测有效)荣耀手机一键激活Xposed框架方法
- python输入班级姓名_python,寻找班级里面名字最长的人
- Android 获取当前系统语言和切换系统语言
- 如何在工作中保持专注力
- pic16多路adc采样
- 一种靠加热内部空间达到超光速飞行的机器
- ds服务器没检测到有响应,设备或资源dns没检测到有响应 网络无法连接
- 奇虎360安全卫士推出木马程序查杀功能