题目

发现我们需要最大化最小值,基本是二分了

那么我们二分出来一个值我们将小于等于这个值的都删去,现在的问题变成了如何用\(n+1\)条路径覆盖这张图

这不最小路径覆盖吗

于是我就忘了最小路径覆盖怎么搞了

在慎老师的教育下我终于知道了最小路径覆盖应该先将每个点拆成两个点,放在二分图的左右两边,对于原图的一条边\((x,y)\),我们就连\((x,y')\),之后最小路径覆盖就等于总点数减最大匹配

其实挺好理解的,先考虑一条匹配边都没有的情况,最小路径覆盖就是总点数,每加入一条匹配边就会让我们少用一次覆盖

代码

#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define LL long long
#define inf 999999999
#define re register
#define maxn 1005
inline int read() {
int x=0;char c=getchar();while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
struct E{int v,nxt,f;}e[maxn*maxn];
int n,num,m,S,T;
int head[maxn],cur[maxn],d[maxn],val[maxn],c[maxn];
std::vector<int> v[maxn];
inline void add(int x,int y,int w) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;e[num].f=w;}
inline void C(int x,int y,int w) {add(x,y,w),add(y,x,0);}
inline int BFS() {
std::queue<int> q;
for(re int i=S;i<=T;i++) cur[i]=head[i],d[i]=0;
d[S]=1,q.push(S);
while(!q.empty()) {
int k=q.front();q.pop();
for(re int i=head[k];i;i=e[i].nxt)
if(e[i].f&&!d[e[i].v]) d[e[i].v]=d[k]+1,q.push(e[i].v);
}
return d[T];
}
int dfs(int x,int now) {
if(x==T||!now) return now;
int flow=0,ff;
for(re int& i=cur[x];i;i=e[i].nxt)
if(d[e[i].v]==d[x]+1) {
ff=dfs(e[i].v,min(e[i].f,now));
if(ff<=0) continue;
now-=ff,flow+=ff,e[i].f-=ff,e[i^1].f+=ff;
if(!now) break;
}
return flow;
}
inline int check(int x) {
int tot=0;
memset(head,0,sizeof(head));num=1;
for(re int i=1;i<=m;i++) {
if(val[i]>=x) continue;
C(S,i,1);C(i+m,T,1);tot++;
for(re unsigned int j=0;j<v[i].size();j++)
if(val[v[i][j]]<x) C(i,v[i][j]+m,1);
}
int ans=tot;
while(BFS()) ans-=dfs(S,inf);
return ans<=n;
}
int main() {
n=read()+1,m=read();
for(re int i=1;i<=m;i++) {
val[i]=read(),num=read();
for(re int j=1;j<=num;j++) v[i].push_back(read());
}
S=0,T=m+m+1;
if(check(inf)) {puts("AK");return 0;}
for(re int i=1;i<=m;i++) c[i]=val[i];
std::sort(c+1,c+m+1);
int l=1,r=m,ans=0;
while(l<=r) {
int mid=l+r>>1;
if(check(c[mid])) l=mid+1,ans=mid;else r=mid-1;
}
printf("%d\n",c[ans]);
return 0;
}

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

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

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

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

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

  3. BZOJ5335 : [TJOI2018]智力竞赛

    二分答案,转化成求最少的路径,覆盖住所有权值$\leq mid$的点. 建立二分图,若$i$的后继为$j$,则连边$i\rightarrow j$,求出最大匹配,则点数减去最大匹配数即为最少需要的路径 ...

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

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

  5. [TJOI2018]智力竞赛【网络流】

    题解: 这垃圾题意 问题二分之后等价于 可重复路径判断能否覆盖一张图 1.用floyd连边(来保证可重复) 然后拆点跑最大流 然后答案=n-最大流 但这样子做本来复杂度就比较高,边数增加了n倍 2.我 ...

  6. 洛谷P4589 [TJOI2018]智力竞赛 【floyd + 二分 + KM】

    题目链接 洛谷P4589 题意可能不清,就是给出一个带权有向图,选出\(n + 1\)条链,问能否全部点覆盖,如果不能,问不能覆盖的点权最小值最大是多少 题解 如果要问全部覆盖,就是经典的可重点的DA ...

  7. 【洛谷P4589】[TJOI2018]智力竞赛(二分+最小链覆盖)

    洛谷 题意: 给出一个\(DAG\),现在要选出\(n+1\)条可相交的链来覆盖,最终使得未被覆盖的点集中,权值最小的点的权值最大. 思路: 显然最终的答案具有单调性,故直接二分答案来判断: 直接将小 ...

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

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

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

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

随机推荐

  1. JSON 教程

    1JSON 1.什么是 JSON ? 1.1JSON:JavaScript 对象表示法(JavaScript Object Notation). 1.2JSON 是存储和交换文本信息的语法.类似 XM ...

  2. Win7系统服务优化完全攻略

      前文提到Windows系统启动的原理,其中加载各项系统服务是影响系统启动时间的重要因素,之前软媒在Win7之家(http://www.win7china.com/)和Vista之家(http:// ...

  3. java设计模式-----5、原型模式

    原型(Prototype)模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例.使用原型模式创建的实例,具有与原型一样的数据. 原型模式的特点: 1.由原型对象自身创建目标对象.也就是说 ...

  4. C# 后台处理图片的几种方式

    第一种: 将上传图片直接保存到本地 var supportedTypes = new[] { "jpg", "jpeg", "png", & ...

  5. js串结构

    朴素匹配算法 //S 主串 T 模式串 //匹配失败,回溯 i = i - j + 1 j = 0 //匹配成功,返回位置 i - j function indexOf(S,T,pos = 0){ l ...

  6. JavaWeb学习总结(八):HttpServletRequest对象

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...

  7. localStorage跟cookie的使用

    最近做了记住密码功能,用localStorage跟cookie都尝试用了一下,感觉都挺好哈,很方便,特此记录 html代码: <input type="text" id=&q ...

  8. webstorm 打开后 一直停留在scanning files to index....,或跳出内存不够的提示框

    用着有时会这样,超级卡, 网上搜了下,原来如此,记录下,免得忘了. ------------------------- 说明: 在npm install 后,会出现Scanning files to ...

  9. 六、angular 生成二维码

    首先需要安装angular-qrcode : bower install monospaced/angular-qrcode npm install angular-qrcode 如何使用? 在相应的 ...

  10. post字符 特殊字符处理【转】

    今天和同事调试接口,由于产品设计的问题,传递的参数没有做任何的限制.同事就在传参数的时候加了些特殊字符到后台,但是后台打印的日志是 null... 然后上网搜了下解决办法:转 https://www. ...