[TJOI 2018]智力竞赛
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]智力竞赛的更多相关文章
- [Offer收割]编程练习赛3 - 题目3 : 智力竞赛
智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...
- hihocoder #1285 智力竞赛
传送门 总结: 1.仔细读题 2.仔细分析复杂度 3.不要想当然,乱下结论 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi.小Ho还有被小Hi强拉来的小Z,准备组队 ...
- 【BZOJ5335】[TJOI2018]智力竞赛(二分图匹配)
[BZOJ5335][TJOI2018]智力竞赛(二分图匹配) 题面 BZOJ 洛谷 题解 假装图不是一个DAG想了半天,.发现并不会做. 于是假装图是一个DAG. 那么显然就是二分答案,然后求一个最 ...
- loj#2574. 「TJOI2018」智力竞赛 (路径覆盖)
目录 题目链接 题解 代码 题目链接 loj#2574. 「TJOI2018」智力竞赛 题解 就是求可重路径覆盖之后最大化剩余点的最小权值 二分答案后就是一个可重复路径覆盖 处理出可达点做二分图匹配就 ...
- 「TJOI 2018」教科书般的亵渎
「TJOI 2018」教科书般的亵渎 题目描述 小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为 \(a_i\) ,且每个怪物血量均不相同, 小豆手里有无限张"亵渎" ...
- 「TJOI 2018」游园会 Party
「TJOI 2018」游园会 Party 题目描述 小豆参加了 \(NOI\) 的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是 \(N, O, I\) 的字样. 在会场上他收集到了 \(K ...
- BZOJ5335:[TJOI2018]智力竞赛——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5335 小豆报名参加智力竞赛,他带上了n个好朋友作为亲友团一块来参加比赛. 比赛规则如下: 一共有m ...
- hihocoder-1285 智力竞赛(区间dp)
智力竞赛 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi.小Ho还有被小Hi强拉来的小Z,准备组队参加一个智力竞赛.竞赛采用过关制,共计N个关卡.在第i个关卡中,小 ...
- 洛谷P4589 [TJOI2018]智力竞赛(二分答案 二分图匹配)
题意 题目链接 给出一个带权有向图,选出n + 1n+1条链,问能否全部点覆盖,如果不能,问不能覆盖的点权最小值最大是多少 Sol TJOI怎么净出板子题 二分答案之后直接二分图匹配check一下. ...
随机推荐
- window 安装mysql
常见错误:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 密码输入错误:无法远程 ...
- java多线程系列5 atomic简介
先看一个例子,AtomicInteger 实现的线程安全的累加器 public class AtomicIntTest { public static void main(String[] args) ...
- python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
os._exit() 和 sys.exit() os._exit() vs sys.exit() 概述 Python的程序有两中退出方式:os._exit(), sys.exit().本文介绍这两种方 ...
- _ZNote_Mac_技巧_QuickLook功能扩展
QuicLook(快速查看)是macOS一项非常方便的独有功能: 当选中一个文件,只需要按下空格键即可查看其内容,在按下空格退出QuickLook, 不需要启动再关闭任何软件. 默认支持大部分视频.音 ...
- STL中的容器作为返回值
分别以函数返回值方式和参数传引用方式测试了vector.map两种容器,代码如下: // testContainer.cpp : Defines the entry point for the con ...
- Buffer cache hit ratio性能计数器真的可以作为SQL Server 内存瓶颈的判断指标吗?
SQL Server中对于Buffer cache hit ratio的理解: Buffer cache hit ratio官方是这么解释的:“指示在缓冲区高速缓存中找到而不需要从磁盘中读取的页的百分 ...
- 五、MongoDB的索引
一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 四.MongoDB的查询 五.MongoDB的索引 1.简介 它就像是一本书的目录,如果没 ...
- 定时任务 Wpf.Quartz.Demo.5 (升级版)
老规矩:先把全部源码上传,见本文底部. 相对于Demo3的区别,就是能自动加载继承了IJob的任务,任务主体程序分离. 在exe执行文件的同级下建一个MyJobs的文件夹,每次会自动扫描该文件夹下的J ...
- Ehcache3开发入门简介
在高并发应用中缓存就是核心机制.最近在研究Ehcache,发现这是一个更加灵活易用的缓存框架(相对于Redis.Memcache),Ehcache更加小巧轻便.而且都有持久化机制,不用担心JVM和服务 ...
- spring boot 集成 thymeleaf
例如meta标签,低版本标签必须要闭合,高版本不用这么严格. pom文件引入高版本jar包如下,propertis里添加: