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 最小割相关推荐

  1. poj 3469(最小割)

    有一些模块(modules)和一个双核处理器,一个模块可以在任意一个核上处理,每个核对应每个模块有个开销.现在有一些模块间需要数据交换,如果需要数据交换的模块在一个核上处理,则不需要额外开销,否则需要 ...

  2. poj 3084(最小割)

    题目链接:http://poj.org/problem?id=3084 思路:题目的意思是不让入侵者进入保护的房间,至少需要锁几道门.网络流建模:设一个超级源点,源点与有入侵者的房间相连,边容量为in ...

  3. POJ 3084 Panic Room (最小割建模)

    [题意]理解了半天--大意就是,有一些房间,初始时某些房间之间有一些门,并且这些门是打开的,也就是可以来回走动的,但是这些门是确切属于某个房间的,也就是说如果要锁门,则只有在那个房间里才能锁. 现在一 ...

  4. poj 1815 Friendship 最小割 拆点 输出字典序

    题目链接:http://poj.org/problem?id=1815 题意:A与B能通信当且仅当A知道B的电话号或者A知道C的电话号且C与B能通信.若A知道B的电话号,那么B也知道A的电话号. 然而 ...

  5. poj 2914(stoer_wanger算法求全局最小割)

    题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t   V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...

  6. POJ - 2914 Minimum Cut(全局最小割-Stoer_Wagner)

    题目链接:点击查看 题目大意:给出一张无向图,要求将其分为两个集合,使得最小割最小 题目分析:算法学习自:https://blog.csdn.net/dingdi3021/article/detail ...

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

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

  8. POJ 3469 Dual Core CPU (最小割建模)

    题意 现在有n个任务,两个机器A和B,每个任务要么在A上完成,要么在B上完成,而且知道每个任务在A和B机器上完成所需要的费用.然后再给m行,每行 a,b,w三个数字.表示如果a任务和b任务不在同一个机 ...

  9. POJ 3469 Dual Core CPU(最小割模型的建立)

    分析: 这类问题的一遍描述,把一些对象分成两组,划分有一些代价,问最小代价.一般性的思路是, 把这两组看成是S点和T点,把划分的代价和割边的容量对应起来求最小割. 把S和可模版tem之间到达关系看作是 ...

最新文章

  1. java 内部类 返回值_Java基础第10天+形式参数和返回值的问题、包、导包、权限修饰符、常见的修饰符、内部类(局部内部类,成员内部类,匿名内部类)...
  2. android t跳转到fragment,Android 使用EventBus进行Fragment和Activity通信
  3. Bootstrap 公布长期支持计划,Bootstrap 3 生命周期结束
  4. C语言之数据类型,C语言之数据类型
  5. .htaccess 基础教程(四)Apache RewriteCond 规则参数
  6. 2021_0207_生活记录
  7. java开发个人简历模板_java程序开发个人简历模板
  8. quartz配置详解
  9. 在Ubuntu安装QT及相关环境配置
  10. winxp计算机如何连接win7计算机,Win7电脑连接XP系统共享打印机的操作方法
  11. 计算机开机桌面黑屏怎么办,小编教你电脑启动后黑屏该怎么办
  12. 严格模式和普通模式的区别
  13. Linux虚拟机无法联网问题解决
  14. 爱你用java代码_[java]__如何用你的编程语言表达至尊宝爱你一万年的浪漫情怀....
  15. 2014计算机基础知识,2014年计算机基础知识练习题240_甘肃中公教育
  16. 报表数据填报中的合法性校验
  17. 微信开发 新浪SAE开发平台 验证Token 一直失败
  18. Python连接MySQL数据库部分问题阐述Connection to @localhost failed. [08001] Could not create connection to databa
  19. LoRa Gateway 笔记汇总
  20. SD-WAN怎么样优化广域网?

热门文章

  1. 红色石头十八岁的天空主题曲铃声 红色石头十八岁的天空主题曲...
  2. STM32 串口下载hex 串口下载程序 CH340串口
  3. 推荐爱码哥移动开发平台十大常用的原生UI控件
  4. 编译原理期末复习—第一章概论
  5. 实习日志 - 第四天
  6. php 抽象工厂模式,PHP设计模式(三)抽象工厂模式(Abstract Factory)
  7. python路线寻优_曲线寻优
  8. Android Studio更新问题
  9. [技术讨论]基本共射共集共基放大电路怎么工作,可以来看看
  10. 分区表与普通表之间切换的报错