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. linux 查看信息-进程&用户&服务&程序

    进程 1.查看所有进程 2.实时显示进程状态 用户 1.查看活动用户 2.查看登录日志 3.查看系统所有用户 4.查看系统所有组 5.查看当前用户的计划任务 服务 1.列出所有系统服务 2.列出所有启 ...

  2. 第一次spring会议

    1.今天查询了很多案例,找到了符合我们要求的案例,并进行了尝试. 2.昨天拍摄了宣传视频. 3.明天准备用C#限定格式输出TXT文件.

  3. C#语言不常用语法笔记

    只看过3天C#语法书,了解个大概,与C++等不同之处,或者看开源遇到一些奇异用法,记录一下,脑子不够用的情况下,还是记笔记靠谱. ==================== 顺便吐槽下,这年头得会各种编 ...

  4. mysql 在原有的时间上加10个月或者一年

    UPDATE SERVER_TIME_LEFT SET END_TIME = DATE_ADD(END_TIME, INTERVAL 10 MONTH) WHERE SHOP_ID BETWEEN 1 ...

  5. 第39章:MongoDB-集群--Replica Sets(副本集)---副本集基本原理

    ①操作日志oplog Oplog是主节点的local数据库中的一个固定集合,按顺序记录了主节点的每一次写操作,MongoDB的复制功能是使用oplog来实现的,备份节点通过查询这个集合就可以知道需要进 ...

  6. Paper | 亚像素运动补偿 + 视频超分辨

    目录 1. ABSTRACT 2. INTRODUCTION 3. RELATED WORKS 4. SUB-PIXEL MOTION COMPENSATION (SPMC) 5. OUR METHO ...

  7. ubuntu16.04安装最新版docker、docker-compose、docker-machine

    安装前说明: 本文将介绍在ubuntu16.04系统下安装和升级docker.docker-compose.docker-machine. docker:有两个版本:docker-ce(社区版)和do ...

  8. Java字符串池(String Pool)深度解析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在工作中,String类是我们使用频率非常高的一种对象类型.JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存 ...

  9. 算法入门:最大子序列和的四种算法(Java)

    最近再学习算法和数据结构,推荐一本书:Data structures and Algorithm analysis in Java 3rd 以下的四种算法出自本书 四种最大子序列和的算法: 问题描述 ...

  10. https网页加载http资源导致的页面报错及解决方案

    https是当下的网站的主流趋势,甚至像苹果这样的大公司,则完全要求用户必须使用https地址. 然而对于以前http链接来说,我们往往就存在一个兼容性问题,因为你不可能一下就全部切换过去,应该在很长 ...