JZOJ 1083. 【GDOI2006】拯救亚特兰蒂斯
\(\text{Solution}\)
自己的网络流技术太拉了
连这样的题都做不出来
对于一个怪物,剑术和法术两样东西有一样就可以了
不难想到二分图中最小点覆盖,一条边只有两个端点之一被选就被覆盖了
最小点覆盖等于最大匹配数
\(\text{Code}\)
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
#define RE register
#define IN inline
using namespace std;
const int N = 11005, INF = 1e9;
int p, n, m, S, T, tot, h[N], dep[N], cur[N], Q[N], bz[N];
vector<int> g[N][2];
map<string, int> mp;
char s[20];
struct edge{int to, nxt, w;}e[N * 10];
IN void add(int x, int y, int w)
{
e[++tot] = edge{y, h[x], w}, h[x] = tot;
e[++tot] = edge{x, h[y], 0}, h[y] = tot;
}
IN int bfs()
{
for(RE int i = S; i <= T; i++) cur[i] = h[i], dep[i] = 0;
int head = 0, tail = 1; Q[1] = S, dep[S] = 1;
while (head < tail)
{
int now = Q[++head];
for(RE int i = h[now]; i; i = e[i].nxt)
{
int v = e[i].to;
if (dep[v] || !e[i].w) continue;
dep[v] = dep[now] + 1, Q[++tail] = v;
}
}
return dep[T];
}
int dfs(int x, int lim)
{
if (x == T || lim <= 0) return lim;
int flow = 0;
for(RE int i = cur[x], v, f; i; i = e[i].nxt)
{
cur[x] = i, v = e[i].to;
if (dep[v] != dep[x] + 1 || !e[i].w) continue;
f = dfs(v, min(lim, e[i].w));
if (f <= 0) continue;
e[i].w -= f, e[i ^ 1].w += f, lim -= f, flow += f;
if (lim <= 0) break;
}
return flow;
}
IN void dinic()
{
int flow = 0;
while (bfs()) flow += dfs(S, INF);
printf("%d\n", flow);
}
int main()
{
scanf("%d%d%d", &p, &n, &m);
while (1)
{
if (n == -1 && m == -1 && p == -1) break;
T = 0, tot = 1, memset(h, 0, sizeof h); int cnt = 0;
for(RE int i = 1; i <= p; i++) g[i][0].clear(), g[i][1].clear(), bz[i] = 0;
for(RE int i = 1; i <= p; i++) scanf("%s", s), mp[s] = ++cnt;
for(RE int i = 1, num, z; i <= n; i++)
{
scanf("%s%d", s, &num);
for(RE int j = 1; j <= num; j++) scanf("%s", s), g[z = mp[s]][0].push_back(i), bz[z] = 1;
}
for(RE int i = 1, num, z; i <= m; i++)
{
scanf("%s%d", s, &num), ++T;
for(RE int j = 1; j <= num; j++) scanf("%s", s), g[z = mp[s]][1].push_back(i + n), bz[z] = 1;
}
int flag = 0;
for(RE int i = 1; i <= p; i++) if (!bz[i]){flag = 1; printf("Poor Atlantis!\n"); break;};
if (!flag)
{
T = n + m + 1;
for(RE int i = 1; i <= n; i++) add(S, i, 1);
for(RE int i = 1; i <= m; i++) add(i + n, T, 1);
for(RE int i = 1; i <= p; i++)
for(RE int j = 0; j < g[i][0].size(); j++)
for(RE int k = 0; k < g[i][1].size(); k++) add(g[i][0][j], g[i][1][j], 1);
dinic();
}
scanf("%d%d%d", &p, &n, &m);
}
}
JZOJ 1083. 【GDOI2006】拯救亚特兰蒂斯的更多相关文章
- 拯救无法启动的虚拟机文件.vmdk中的数据
FROM: http://blog.csdn.net/npy_lp/article/details/7686583 从事Linux开发的软件工程师几乎都使用过虚拟机软件,如VMware worksta ...
- 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动
一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...
- 一次U盘拯救的经历
U盘拷资料,突然就弹出框框,复制终止了,然后U盘里面的只是编程可读的了. 倒是没有啥重要的资料,就是只有这一个U盘了,平时传资料都靠它,不能就这么垮了啊,于是就来了一次拯救行动. 一共有三个步骤 第一 ...
- OpenJudge4980:拯救行动//stl优先队列
总时间限制: 10000ms 内存限制: 65536kB 描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路(@). ...
- 【BZOJ-3174】拯救小矮人 贪心 + DP
3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 686 Solved: 357[Submit][Status ...
- HDU 1083 网络流之二分图匹配
http://acm.hdu.edu.cn/showproblem.php?pid=1083 二分图匹配用得很多 这道题只需要简化的二分匹配 #include<iostream> #inc ...
- BZOJ 1083 题解
1083: [SCOI2005]繁忙的都市 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2431 Solved: 1596[Submit][Sta ...
- SQLSERVER拯救某个时间点被误删除的数据
SQLSERVER拯救某个时间点被误删除的数据 转载自:http://blog.csdn.net/dba_huangzj/article/details/8491327 要拯救某个时间点被误删除的数据 ...
- 我发现:在StackOverflow上拯救歪果仁十分有意思!
菊长:火星特工们!今天是周五了,大家有什么提议? BeJavaGod:报告菊长!我发现,在StackOverflow上拯救歪果仁十分有意思! 噗哈哈,时不时遇到问题会使用到StackOverflow, ...
- POJ 1083 Moving Tables 思路 难度:0
http://poj.org/problem?id=1083 这道题题意是有若干段线段,每次要求线段不重叠地取,问最少取多少次. 因为这些线段都是必须取的,所以需要让空隙最小 思路: 循环直到线段全部 ...
随机推荐
- 关于cannot remove ‘directory': Directory not empty的解决办法
解决方法 首先你应该使用 rm -rf 目录名 这样确保可以递归删除目录 如果出现 cannot remove 'directory': Directory not empty 报错信息,重启电脑解决 ...
- vulnhub靶场之Chronos:1
准备: 攻击机:虚拟机kali.本机win10. 靶机:Chronos,下载地址:https://download.vulnhub.com/chronos/Chronos.ova,下载后直接vbox打 ...
- Fastjson漏洞+复现
1.漏洞介绍 FastJson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性.通过查找代码中相关的方法,即可构造出一些恶意利用链. ...
- Django的manytomany字段
manytomany字段 用于表示多对多的关系,最常见的就是老师和班级的例子 一个老师可以教多个班级,一个班级也可以有多个老师 add 添加关系 teachers=models.Teacher.obj ...
- 介绍一款高性能分布式MQTT Broker(带web)
SMQTTX介绍 SMQTTX是基于SMQTT的一次重大技术升级,基于Java开发的分布式MQTT集群,是一款高性能,高吞吐量,并且可以完成二次开发的优秀的开源MQTT broker,主要采用技术栈: ...
- ArcObjects SDK开发 016 在ArcMap中使用Toolbox
1.如何找到ToolBox 通过Geoprocessing菜单上的ArcToolbox菜单项,可以打开ArcToolbox面板. 工具栏上也有一个ArcToolbox的按钮,点击该按钮也可以打开. 通 ...
- 【机器学习】李宏毅——Flow-based Generative Models
前文我介绍了部分关于生成学习的内容,可以参考我这篇博文点此 前面介绍的各个生成模型,都存在一定的问题: 对于PixelRNN这类模型来说,就是从左上角的像素开始一个个地进行生成,那么这个生成顺序是否合 ...
- paozhu c++ web framework 框架原理
paozhu c++ web framework 框架原理 paozhu c++ web framework 使用 asio 网络库,如果用动态库方式还要boost库. paozhu框架 使用两个线程 ...
- react 高效高质量搭建后台系统 系列 —— antd和样式
其他章节请看: react 高效高质量搭建后台系统 系列 antd 后续要做登录模块(主页),不仅要解决请求数据的问题,还需要完成 antd 配置以及样式的准备. antd 多种主题风格 详情请看 这 ...
- Js文件名 排序
参考了别人帖子后,调整之后的排序方法,更加精确.(参考链接在底部) 压缩版 function strCompare(str1,str2){if(str1==undefined&&str ...