POJ_3084

这个题目的题意感觉好费解,最后还是连蒙带猜才搞懂的。首先题目中说的门大概是这样的:可以是开着的也可以是锁着的,如果是锁着的也可以从门的某一侧打开,但是另一侧就没法打开。图中每个CP都对应了一个门,CP所在的房间就是能打开锁着的门的那一侧。

实际上我们就是要关闭一些门,使得从入侵者的位置开始(不妨标记为S)出发,不能够到达要保护的房间(不妨标记为T)。对于任意一扇门来讲,如果从能打开它的那一侧走的话,显然锁上也是白搭的,而如果从另一侧走的话,那么锁和不锁还是有区别的。于是不妨将一扇门看成两条边,一条是从能打开它的那一侧走到另一侧的边,容量设为INF,另一条是反向的,容量设为1,这样做S到T的最小割就是最后的解,因为这时可以将点分成两部分,一部分是从S可以到达的,另一部分是可以到达T的,而且没办法从S这边沿可走的边(也就是非满流的边)走到T,这样就相当于把T保护起来了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXD 30
#define MAXM 1650
#define INF 0x3f3f3f3f
int N, T, first[MAXD], e, next[MAXM], v[MAXM], flow[MAXM];
int S, SS, d[MAXD], q[MAXD], work[MAXD];
void add(int x, int y, int z)
{v[e] = y, flow[e] = z;next[e] = first[x], first[x] = e ++;
}
void init()
{int i, j, k, n;char b[5];scanf("%d%d", &N, &T);SS = N, S = N + 1;memset(first, -1, sizeof(first[0]) * (N + 2)), e = 0;for(i = 0; i < N; i ++){scanf("%s", b);if(b[0] == 'I')add(SS, i, INF), add(i, SS, 0);scanf("%d", &n);for(j = 0; j < n; j ++){scanf("%d", &k);add(i, k, INF), add(k, i, 0);add(k, i, 1), add(i, k, 0);    }    }add(S, SS, INF);
}
int bfs()
{int i, j, rear = 0;memset(d, -1, sizeof(d[0]) * (N + 2));d[S] = 0, q[rear ++] = S;for(i = 0; i < rear; i ++)for(j = first[q[i]]; j != -1; j = next[j])if(flow[j] && d[v[j]] == -1){d[v[j]] = d[q[i]] + 1, q[rear ++] = v[j];if(v[j] == T) return 1;}return 0;
}
int dfs(int cur, int a)
{if(cur == T) return a;for(int &i = work[cur]; i != -1; i = next[i])if(flow[i] && d[v[i]] == d[cur] + 1)if(int t = dfs(v[i], std::min(a, flow[i]))){flow[i] -= t, flow[i ^ 1] += t;return t;    }return 0;
}
int dinic()
{int ans = 0, t;while(bfs()){memcpy(work, first, sizeof(first[0]) * (N + 2));while(t = dfs(S, INF))ans += t;    }return ans;
}
void solve()
{int ans = dinic();if(ans == INF)printf("PANIC ROOM BREACH\n");elseprintf("%d\n", ans);
}
int main()
{int t;scanf("%d", &t);while(t --){init();solve();}return 0;
}
/*
Sample Input:5
4 0
NI 1 1
NI 0
NI 2 1 3
I 04 0
NI 0
NI 1 0
NI 1 1
I 1 24 0
NI 2 1 2
NI 0
NI 2 1 3
I 04 0
NI 2 1 3
NI 0
NI 2 1 3
I 03 0
NI 1 2
NI 1 2
I 0Sample Output:1
PANIC ROOM BREACH
1
2
1*/

转载于:https://www.cnblogs.com/staginner/archive/2012/08/17/2644365.html

POJ 3084 Panic Room相关推荐

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

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

  2. POJ 3084 Panic Room | 最小割

    题意: 一间屋子,有多个房间,编号从0开始.CP所在的那间房表示从该房可以打开这个门. 输入时给出房间的数量,以及所要保护的某间房间的编号. 然后指出入侵者所在房间(入侵者可能不止一个).问你能否通过 ...

  3. poj 3084(最小割)

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

  4. poj 3084 最小割

    1 /* 2 题意:给出m个房间,给出房间的连接情况,样例中给出的是第i间房可以到达t号房,而且 3 是无法阻止的,因为控制器在第i间房的这边,而且两个房间可以有多扇门:问最少要关闭 4 多少个门锁才 ...

  5. poj pku图论、网络流入门题总结、汇总

    poj pku图论.网络流入门题总结.汇总 分类: acm图论 2010-08-25 18:49 243人阅读 评论(0) 收藏 举报 网络算法networkgraphconstructioninte ...

  6. POJ 图论分类 + DP(较全 自己又加了点)

    DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...

  7. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  8. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  9. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

最新文章

  1. ViewBag与ViewData传值乱码问题解决方案
  2. 业务理解有偏差,产品和开发如何达成共识?
  3. [JavaScript][转]offsetParent和parentElement的区别
  4. CreateThread函数
  5. mysql+缓冲池脏块率高_什么是数据库的 “缓存池” ?(万字干货)
  6. Java中布尔值的定义_使用简单的布尔值作为自定义验证器
  7. java实例变量,局部变量,类变量和final变量
  8. java 计算器api_用JAVA编写一个简单的计算器~要使用接口的~急啊~
  9. 自定义编程移植的加密芯片
  10. 实现100以内的素数输出(Python与C++对比)
  11. python函数定义及调用-Python函数的基本定义和调用以及内置函数
  12. java 主流算法_java常用算法
  13. ECS Windows 系统蓝屏 (BSOD) 以及停止响应 (Hang) 的处理
  14. 【全源码及文档】基于JAVA的干部档案管理系统
  15. b站视频怎么引流?b站做什么视频有流量?b站流量引流技巧
  16. 【渝粤教育】电大中专药理学基础作业 题库
  17. shell脚本之国际象棋棋盘
  18. 更新后的微信新功能,你知道吗?
  19. 微信跳一跳刷分代码剖析
  20. Chango的数学Shader世界(十四)细线间断,发光闪烁,TAA削弱处理

热门文章

  1. Android中关于线性布局基线对齐的讲述
  2. Mac下下载android4.2源码,进行源码调试
  3. 数论基础_欧几里德算法
  4. as2 AVM1对象和as3对象的通信
  5. The Linux SG_IO ioctl in the 2.6 series
  6. 关于正点原子STM32的MDK例程移植到IAR中遇到的错误解决方法 __use_no_semihosting
  7. heima Oracle day2
  8. java的indexof怎么配合数组使用_【小知识点??】indexOf在数组中竟能这样使用???!...
  9. springboot 压测 50并发 线程等待_Spring Boot中三款内嵌容器的使用
  10. jupyter ipython display_Tensorflow从jupyter / Ipython运行动画