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 这道题题意是有若干段线段,每次要求线段不重叠地取,问最少取多少次. 因为这些线段都是必须取的,所以需要让空隙最小 思路: 循环直到线段全部 ...
随机推荐
- qtcreator 报错error: You need to set an executable in the custom run configuration.
解决 没有配置运行的可执行文件. 在 Executable 中填入正确的可执行文件位置,这里我使用了一个变量,可以根据 release,debug的区别自动找到对应的可执行文件.
- mysql数据库报错 sql 1452 Cannot add or update a child row:a foreign key constraint fails
其实这句话的意思就是你添加一个值是一个外键,但是这个外键不在关联的数据库中的主键中,这样就导致了添加失败了,解决办法就是添加对应关联数据库的主键的值,不过我要提醒一下!(也就是我采的坑!) 一定要看清 ...
- 看起来简单实际上却很牛的KMP算法:LeetCode572-另一棵树的子树
题目描述 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 暴力解法 从 ...
- MySQL可视化软件(Navicat)部署与使用
目录 一:可视化软件(Navicat) 1.什么是可视化软件? 2.什么是Navicat? 二:部署MySQL(Navicat) 1.Navicat连接本地MySQL 2.连接MySQL,输入密码,在 ...
- Qt的三套无边框窗体的方案:可按比例拖拽窗体大小的无边框窗口和几个常见的无边框实例
一.可按比例拖拽窗体大小的无边框窗口 前几天接到一个需求,就是视频广播的窗体画面要可以拖拽,修改成了可以拖拽全屏的窗口之后,又有一个问题:视频画面也被拉伸了. 由于视频画面是有比例的,所以我们最好也能 ...
- Win10下SDK Manager应用程序闪退问题的解决方法
SDK Manager闪退原因:未找到Java的正确路径 解决办法: 1.在压缩包中找到Android.bat文件,右键编辑 2.打开的Android文件内容,找到如图的几行代码 将上面的代码替换成: ...
- 基于.NetCore开发博客项目 StarBlog - (22) 开发博客文章相关接口
前言 本文介绍博客文章相关接口的开发,作为接口开发介绍的第一篇,会写得比较详细,以抛砖引玉,后面的其他接口就粗略带过了,着重于WebApi开发的周边设施. 涉及到的接口:文章CRUD.置顶文章.推荐文 ...
- 使用time.Time数据类型获取时间报错
报错类型:Error 1292: Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1 在添加用户到数据库时, ...
- mybatis 之定义拦截器 控制台SQL的打印
类型 先说明Mybatis中可以被拦截的类型具体有以下四种: 1.Executor:拦截执行器的方法.2.ParameterHandler:拦截参数的处理.3.ResultHandler:拦截结果集的 ...
- 2020强网杯青少赛Pursuing_The_Wind战队WRITEUP
在线文档:https://docs.qq.com/doc/DZkN0RFFaR1ZDdHhD 旧事拾荒,偶遇该文档,既发. 战队信息 战队名称:Pursuing_The_Wind 战队排名:12 ...