poj 3084 最小割
1 /* 2 题意:给出m个房间,给出房间的连接情况,样例中给出的是第i间房可以到达t号房,而且 3 是无法阻止的,因为控制器在第i间房的这边,而且两个房间可以有多扇门;问最少要关闭 4 多少个门锁才使得入侵者无法到达n号房间(如果在控制器的这一边,则即使锁上也无法防止 5 入侵者走这扇门); 6 7 题解:最小割==最大流 8 关键是建图,题目给出的是i->j是连通的,然后我们要加的是逆向边j->i,权值为1,表示要 9 阻止入侵者需要通过这些们进入房间j需要锁上1把锁,里面的重边就表示有多扇门都需要上 10 锁;然后再加边i->j,权值为inf,表示要加上无限把锁才能阻止入侵者(即不可能,因为有控 11 制器),然后加入源点0,与所有入侵者点相连,权值为inf,表示源点出发到这些点必然能够 12 进入(这是显然的),然后就是求0到n的最小割,最少的权值和能将n点与入侵者的点分开, 13 返回的最大流的值如果大于等于inf则表示找不到这样的最小割,输出失败信息; 14 这里从源点0到入侵者点的边初始为inf,因此找到的最大流小于inf则必然是全部从原图中的 15 边找到而不包含源点连接的边 16 */ 17 #include <cstdio> 18 #include <cstring> 19 #define clr(a,b) (memset(a,b,sizeof(a))) 20 #define cpy(a,b) (memcpy(a,b,sizeof(b))) 21 const int I = 0x7f7f7f7f; 22 const int NV = 500; 23 const int NE = 100000; 24 int n,m; 25 int start,end; 26 inline int Min(int a,int b) {return a < b ? a : b;} 27 struct MF { 28 int pre[NV],gap[NV],dis[NV],head[NV],cur[NV]; 29 int node,nodenum; 30 struct edge { 31 int s,t,val,next; 32 edge(){} 33 edge(int _s,int _t,int _val,int _next) : 34 s(_s),t(_t),val(_val),next(_next){} 35 }E[NE]; 36 inline void init(int num) { 37 nodenum = num; 38 clr(head,-1); 39 node = 0; 40 } 41 inline int sap(int s,int t) { 42 int i; 43 clr(dis,0); 44 clr(gap,0); 45 cpy(cur,head); 46 int u = pre[s] = s,v,maxflow = 0; 47 int mi = I; 48 gap[0] = nodenum; 49 while(dis[s] < nodenum) { 50 loop: 51 for(int &e = cur[u];e != -1;e = E[e].next) { 52 v = E[e].t; 53 if(E[e].val && dis[u] == dis[v] + 1) { 54 mi = Min(mi,E[e].val); 55 pre[v] = u; 56 u = v; 57 if(v == t) { 58 maxflow += mi; 59 for(u = pre[u];v != s;v = u,u = pre[u]) { 60 E[ cur[u] ].val -= mi; 61 E[ cur[u]^1 ].val += mi; 62 } 63 mi = I; 64 } 65 goto loop; 66 } 67 } 68 int midis = nodenum; 69 for(i = head[u];i != -1;i = E[i].next) { 70 v = E[i].t; 71 if(E[i].val && midis > dis[v]) { 72 cur[u] = i; 73 midis = dis[v]; 74 } 75 } 76 if( (-- gap[ dis[u] ]) == 0 ) break; 77 gap[ dis[u] = midis + 1 ] ++; 78 u = pre[u]; 79 } 80 return maxflow; 81 } 82 inline void insert(int u,int v,int c,int cc = 0) { 83 E[node] = edge(u,v,c,head[u]); 84 head[u] = node ++; 85 E[node] = edge(v,u,cc,head[v]); 86 head[v] = node ++; 87 } 88 }G; 89 90 91 int main() { 92 int t; 93 scanf("%d",&t); 94 while (t--) { 95 int n,m; 96 scanf("%d%d",&m,&n); 97 n++; 98 char s[5]; 99 G.init(m+1); 100 for(int i=1; i<=m; i++) 101 { 102 int c; 103 scanf("%s%d",s,&c); 104 if ('I' == s[0]) 105 G.insert(0,i,I); 106 107 for(int j=0; j<c; j++) 108 { 109 int num; 110 scanf("%d",&num); 111 num++; 112 G.insert(num,i,1); 113 G.insert(i,num,I); 114 } 115 } 116 m++; 117 int ans = G.sap(0,n); 118 if (ans >= I) 119 printf("PANIC ROOM BREACH\n"); 120 else 121 printf ("%d\n", ans ); 122 } 123 return 0; 124 }
转载于:https://www.cnblogs.com/toufu/p/3675661.html
poj 3084 最小割相关推荐
- poj 3469(最小割)
有一些模块(modules)和一个双核处理器,一个模块可以在任意一个核上处理,每个核对应每个模块有个开销.现在有一些模块间需要数据交换,如果需要数据交换的模块在一个核上处理,则不需要额外开销,否则需要 ...
- poj 3084(最小割)
题目链接:http://poj.org/problem?id=3084 思路:题目的意思是不让入侵者进入保护的房间,至少需要锁几道门.网络流建模:设一个超级源点,源点与有入侵者的房间相连,边容量为in ...
- POJ 3084 Panic Room (最小割建模)
[题意]理解了半天--大意就是,有一些房间,初始时某些房间之间有一些门,并且这些门是打开的,也就是可以来回走动的,但是这些门是确切属于某个房间的,也就是说如果要锁门,则只有在那个房间里才能锁. 现在一 ...
- poj 1815 Friendship 最小割 拆点 输出字典序
题目链接:http://poj.org/problem?id=1815 题意:A与B能通信当且仅当A知道B的电话号或者A知道C的电话号且C与B能通信.若A知道B的电话号,那么B也知道A的电话号. 然而 ...
- poj 2914(stoer_wanger算法求全局最小割)
题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...
- POJ - 2914 Minimum Cut(全局最小割-Stoer_Wagner)
题目链接:点击查看 题目大意:给出一张无向图,要求将其分为两个集合,使得最小割最小 题目分析:算法学习自:https://blog.csdn.net/dingdi3021/article/detail ...
- POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】
题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...
- POJ 3469 Dual Core CPU (最小割建模)
题意 现在有n个任务,两个机器A和B,每个任务要么在A上完成,要么在B上完成,而且知道每个任务在A和B机器上完成所需要的费用.然后再给m行,每行 a,b,w三个数字.表示如果a任务和b任务不在同一个机 ...
- POJ 3469 Dual Core CPU(最小割模型的建立)
分析: 这类问题的一遍描述,把一些对象分成两组,划分有一些代价,问最小代价.一般性的思路是, 把这两组看成是S点和T点,把划分的代价和割边的容量对应起来求最小割. 把S和可模版tem之间到达关系看作是 ...
最新文章
- java 内部类 返回值_Java基础第10天+形式参数和返回值的问题、包、导包、权限修饰符、常见的修饰符、内部类(局部内部类,成员内部类,匿名内部类)...
- android t跳转到fragment,Android 使用EventBus进行Fragment和Activity通信
- Bootstrap 公布长期支持计划,Bootstrap 3 生命周期结束
- C语言之数据类型,C语言之数据类型
- .htaccess 基础教程(四)Apache RewriteCond 规则参数
- 2021_0207_生活记录
- java开发个人简历模板_java程序开发个人简历模板
- quartz配置详解
- 在Ubuntu安装QT及相关环境配置
- winxp计算机如何连接win7计算机,Win7电脑连接XP系统共享打印机的操作方法
- 计算机开机桌面黑屏怎么办,小编教你电脑启动后黑屏该怎么办
- 严格模式和普通模式的区别
- Linux虚拟机无法联网问题解决
- 爱你用java代码_[java]__如何用你的编程语言表达至尊宝爱你一万年的浪漫情怀....
- 2014计算机基础知识,2014年计算机基础知识练习题240_甘肃中公教育
- 报表数据填报中的合法性校验
- 微信开发 新浪SAE开发平台 验证Token 一直失败
- Python连接MySQL数据库部分问题阐述Connection to @localhost failed. [08001] Could not create connection to databa
- LoRa Gateway 笔记汇总
- SD-WAN怎么样优化广域网?