Description

题库链接

给出一张 \(m\) 个点的有向图。问可重最小路径覆盖是否 \(\leq n+1\) 。若不,求最多用 \(n+1\) 条路径去覆盖,最大化未覆盖点点权最小值。

\(1\leq n\leq 50,1\leq m\leq 500\)

Solution

\(\text{floyd}\) 传递闭包之后做最小路径覆盖...

若无解,考虑二分未覆盖点点权最小值,将点权小于 \(mid\) 的点加入图中做最小路径覆盖。

写这题其实是打 \(\text{dinic}\) 板子的...

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 500+5, inf = ~0u>>1; int n, m, G[N][N], v[N], k, u;
struct tt {int to, next, cap; }edge[N*N<<1];
int path[N<<1], top, S = (N<<1)-2, T = (N<<1)-1;
int sta[N<<1], cur[N<<1], dist[N<<1];
queue<int>Q; bool bfs() {
memset(dist, -1, sizeof(dist));
Q.push(S); dist[S] = 1;
while (!Q.empty()) {
int u = Q.front(); Q.pop();
for (int i = path[u], v; ~i; i = edge[i].next)
if (dist[v = edge[i].to] == -1 && edge[i].cap > 0)
Q.push(v), dist[v] = dist[u]+1;
}
return dist[T] != -1;
}
int dinic() {
int totflow = 0;
while (bfs()) {
int u = S; top = 0; memcpy(cur, path, sizeof(cur));
while (1) {
if (u == T) {
int loc, minflow = inf;
for (int i = 1; i <= top; i++) if (edge[sta[i]].cap < minflow) minflow = edge[sta[loc = i]].cap;
for (int i = 1; i <= top; i++) edge[sta[i]].cap -= minflow, edge[sta[i]^1].cap += minflow;
totflow += minflow; u = edge[sta[loc]^1].to, top = loc-1;
}
for (int &i = cur[u], v; ~i; i = edge[i].next)
if (dist[v = edge[i].to] == dist[u]+1 && edge[i].cap > 0) {
sta[++top] = i, u = v; break;
}
if (cur[u] == -1) {
if (top == 0) break;
dist[u] = -inf; u = edge[sta[top--]^1].to;
}
}
}
return totflow;
}
void add(int u, int v, int c) {
edge[++top] = (tt){v, path[u], c}; path[u] = top;
edge[++top] = (tt){u, path[v], 0}; path[v] = top;
}
bool judge(int mid) {
memset(path, top = -1, sizeof(path)); int cnt = 0;
for (int i = 1; i <= m; i++) add(S, i, 1), add(i+N-5, T, 1);
for (int i = 1; i <= m; i++)
if (v[i] < mid) {
++cnt;
for (int j = 1; j <= m; j++)
if (v[j] < mid && G[i][j])
add(i, j+N-5, 1);
}
return cnt-dinic() <= n+1;
}
void work() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &v[i], &k);
for (int j = 1; j <= k; j++) scanf("%d", &u), G[i][u] = 1;
}
for (int k = 1; k <= m; k++)
for (int i = 1; i <= m; i++)
for (int j = 1; j <= m; j++)
G[i][j] |= (G[i][k]&G[k][j]);
if (judge(1000000000+1)) {puts("AK"); return; }
int L = 0, R = 1e9, ans;
while (L <= R) {
int mid = (L+R)>>1;
if (judge(mid)) ans = mid, L = mid+1;
else R = mid-1;
}
printf("%d\n", ans);
}
int main() {work(); return 0; }

[TJOI 2018]智力竞赛的更多相关文章

  1. [Offer收割]编程练习赛3 - 题目3 : 智力竞赛

    智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...

  2. hihocoder #1285 智力竞赛

    传送门 总结: 1.仔细读题 2.仔细分析复杂度 3.不要想当然,乱下结论 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi.小Ho还有被小Hi强拉来的小Z,准备组队 ...

  3. 【BZOJ5335】[TJOI2018]智力竞赛(二分图匹配)

    [BZOJ5335][TJOI2018]智力竞赛(二分图匹配) 题面 BZOJ 洛谷 题解 假装图不是一个DAG想了半天,.发现并不会做. 于是假装图是一个DAG. 那么显然就是二分答案,然后求一个最 ...

  4. loj#2574. 「TJOI2018」智力竞赛 (路径覆盖)

    目录 题目链接 题解 代码 题目链接 loj#2574. 「TJOI2018」智力竞赛 题解 就是求可重路径覆盖之后最大化剩余点的最小权值 二分答案后就是一个可重复路径覆盖 处理出可达点做二分图匹配就 ...

  5. 「TJOI 2018」教科书般的亵渎

    「TJOI 2018」教科书般的亵渎 题目描述 小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为 \(a_i\) ,且每个怪物血量均不相同, 小豆手里有无限张"亵渎" ...

  6. 「TJOI 2018」游园会 Party

    「TJOI 2018」游园会 Party 题目描述 小豆参加了 \(NOI\) 的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是 \(N, O, I\) 的字样. 在会场上他收集到了 \(K ...

  7. BZOJ5335:[TJOI2018]智力竞赛——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5335 小豆报名参加智力竞赛,他带上了n个好朋友作为亲友团一块来参加比赛. 比赛规则如下: 一共有m ...

  8. hihocoder-1285 智力竞赛(区间dp)

    智力竞赛 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi.小Ho还有被小Hi强拉来的小Z,准备组队参加一个智力竞赛.竞赛采用过关制,共计N个关卡.在第i个关卡中,小 ...

  9. 洛谷P4589 [TJOI2018]智力竞赛(二分答案 二分图匹配)

    题意 题目链接 给出一个带权有向图,选出n + 1n+1条链,问能否全部点覆盖,如果不能,问不能覆盖的点权最小值最大是多少 Sol TJOI怎么净出板子题 二分答案之后直接二分图匹配check一下. ...

随机推荐

  1. SpringMvc在返回数据之前进行统一处理

    这里其实有多种解决方案 如果你不需要获取request对象 可以采用aop(环绕通知)的方式来统一修改 如果你需要获取request对象,那么就需要采用下面的方式 0自己定义一个注解,内容如下 @Ta ...

  2. python+selenium—webdriver入门(二)

    本文中主要介绍webdriver常见的对象定位方法: 一.对象定位的目的 二.常见的对象定位方法 一.对象定位的目的: 1.操作对象 2.获得对象的属性,如:对象的class属性.name属性等 3. ...

  3. vue中遇到的一个点击展开或收起并且改变背景颜色的问题。

    <template> <div class="expense-center"> <div class="fl expense-left&qu ...

  4. 单色三角形(hdu-5072

    单色三角形模型:空间里有n个点,任意三点不共线.每两个点之间都用红色或者黑色线段链接.如果一个三角形的三条边同色,责成这个三角形是单色三角形.对于给定的红色线段列表,找出单色三角形的个数. 分析:对于 ...

  5. SAS 逻辑库

    SAS逻辑库 SAS逻辑库是一个或多个SAS文件的集合,用于组织.查找和管理 SAS文件.SAS逻辑库管理的SAS文件包括SAS数据集.SAS目录.已编 译的SAS程序,以及多维数据库文件等. 1.逻 ...

  6. sublime使用技巧汇总

    sublime使用技巧 Ubuntu下安装sublime text 3143版本 Install the GPG key: wget -qO - https://download.sublimetex ...

  7. 有关PHPhash算法

    https://www.cnblogs.com/shangzekai/p/4444169.html

  8. Rgb2Gray

    GPU上运行的函数又称为Kernel,用__global__修饰 调用Kernel函数时,用FunctionCall<<<block_shape, thread_shape, int ...

  9. 通过Function Score Query优化Elasticsearch搜索结果(综合排序)

    在使用 Elasticsearch 进行全文搜索时,搜索结果默认会以文档的相关度进行排序,如果想要改变默认的排序规则,也可以通过sort指定一个或多个排序字段. 但是使用sort排序过于绝对,它会直接 ...

  10. 我来谈谈PHP和JAVA在web开发上的的区别

    这里的标题写的是谈谈PHP和JAVA的区别,其实是委婉的说法,其实别人是想听PHP好还是JAVA好!!! 从而从中找到存在感!!! 因为由于我是从多年的php开发转到java开发的.所以最,不时的有好 ...