sicily 1402Panic Room(最大流最小割)
2011-02-27 10:59
260 查看
View Code
设置超级源点s(此处标号为m的房间就是源点),如果房间k有入侵者(intruder),则存在一条有s指向k的弧,且容量为c(s,k)=INF;然后是处理由门联通的两个房间的关系了。 (1)如果房间i和j有门且cp在i,则c(i,j)=INF,c(j,i)=1; (2)如果房间i和j有门且cp在j,则c(i,j)=1,c(j,i)=INF; 超级汇点t就是要保护的房间号码。计算从s到t的最大流ans.若ans>=INF,说明无法保护,否则ans为需要锁上的门的最小数量。 #include <iostream> #include <cstring> #include <string> #include <queue> #include <cstdio> using namespace std; const int MAX = 25; const int INF = 2000; int map[MAX][MAX],m,n,t,pre[MAX]; bool vis[MAX]; int Maxflow() { int ans = 0; while(true) { memset(vis,false,sizeof(vis)); memset(pre,0,sizeof(pre)); queue<int> q; q.push(m); vis[m] = true; while(!q.empty()) { int cur = q.front(); q.pop(); if(cur == n) break; for(int i = 0;i < m;++i) { if(!vis[i] && map[cur][i]) { vis[i] = true; q.push(i); pre[i] = cur; } } } if(!vis ) break; int Min = INF,u; for( u = n;u != m;u = pre[u]) { if(Min > map[pre[u]][u]) Min = map[pre[u]][u]; } for(u = n;u != m;u = pre[u]) { map[pre[u]][u] -= Min; map[u][pre[u]] += Min; } ans += Min; } return ans; } int main() { int i,lead_to,room; string is_intr; scanf("%d",&t); while(t--) { memset(map,0,sizeof(map)); scanf("%d %d",&m,&n); for(i = 0;i < m;++i) { cin>>is_intr>>lead_to; if(is_intr == "I") map[m][i] = INF; while(lead_to--) { scanf("%d",&room); map[i][room] = INF; map[room][i]++; } } int ans = Maxflow(); if(ans >= INF ) cout<<"PANIC ROOM BREACH"<<endl; else cout<<ans<<endl; } return 0; }
相关文章推荐
- 第十二周:[Sicily]1402. Panic Room
- [Sicily]1402. Panic Room(week 16)
- 第十三周:( Sicily1402) Panic Room(c++)
- poj3084 Panic Room 最小割最大流Dinic
- POJ 3084 Panic Room(最大流最小割)
- Sicily 1402. Panic Room
- * 问题描述:输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。
- 最大最小公倍数
- 二分图 最小覆盖数 = 最大匹配数、最大独立集 = 总数-最小覆盖集 证明 hdu 1068
- sicily 1800 序列,求长度在L-U之间的区间的最小值
- 找出最大值和最小值的时间复杂度比较小的一种方法
- bzoj 1497(最小割,最大权闭合子图)
- 从三个排好序的整数数组中分别选一个元素,使得这三个元素的最大差最小
- 堆优先用完全二叉树表示、堆的特性和最大最小堆
- [swustoj1739] 魔术球问题 (最大流,最小路径覆盖)
- python3-开发进阶 heapq模块(如何查找最大或最小的N个元素)
- [SWUST1738] 最小路径覆盖问题(最大流,最小路径覆盖)
- hdu 4289 Control 最小割最大流
- java代码数组求平均值,最大值,最小值
- csu 1307 最大值最小,