BZOJ5412 : circle
若仅保留这$k$个点仍然有环,那么显然无解。
否则设$A$表示这$k$个点的集合,$B$表示剩下的点的集合,因为是竞赛图,每个集合内部的拓扑关系是一条链,方便起见将所有点按照在所在集合的链上的位置进行重标号。
对于$B$中每个点$i$,求出$l_i$表示最小的$j$,满足$B_i\rightarrow A_j$有边,再求出$r_i$表示最大的$j$,满足$A_j\rightarrow B_i$有边。
那么需要保留$B$中尽可能多的点,满足对于任意两个点$B_j,B_i(j\leq i)$都有$r_j<l_i$,不然就会有环,即$l_i>\max(r_j)(j\leq i)$。
考虑DP,设$f[i][j]$表示考虑$B$中前$i$个点,前面选择的点的$r$的最大值为$j$时最多可以选择几个点,暴力转移即可。
时间复杂度$O(n^2)$。
#include<cstdio>
const int N=2010,BUF=12000000;
char Buf[BUF],*buf=Buf;
int n,m,i,j,x,y,l[N],r[N],L,R,a[N],ca,b[N],cb,q[N],h,t,d[N],cnt;bool g[N][N],vip[N];
int f[N][N],ans;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
void toposort(int S){
for(i=1;i<=n;i++)d[i]=0;
for(i=1;i<=n;i++)if(vip[i]==S)for(j=1;j<=n;j++)if(vip[j]==S)d[j]+=g[i][j];
for(h=i=1,t=cnt=0;i<=n;i++)if(vip[i]==S){
cnt++;
if(!d[i])q[++t]=i;
}
while(h<=t)for(x=q[h++],i=1;i<=n;i++)if(vip[i]==S&&g[x][i])if(!(--d[i]))q[++t]=i;
}
inline void up(int&a,int b){a<b?(a=b):0;}
inline int max(int a,int b){return a>b?a:b;}
int main(){
fread(Buf,1,BUF,stdin);read(n),read(m);
for(i=1;i<=n;i++)for(j=1;j<=n;j++)read(x),g[i][j]=x;
for(i=1;i<=m;i++)read(x),vip[x]=1;
toposort(1);
if(t<cnt)return puts("impossible"),0;
for(i=1;i<=cnt;i++)a[++ca]=q[i];
toposort(0);
for(i=1;i<=cnt;i++)b[++cb]=q[i];
for(i=1;i<=ca;i++)d[a[i]]=i;
for(i=1;i<=cb;i++){
x=b[i];
L=ca+1,R=0;
for(j=1;j<=n;j++)if(vip[j]){
y=d[j];
if(g[x][j]){
if(y<L)L=y;
}else if(y>R)R=y;
}
for(j=0;j<=ca;j++)f[i][j]=f[i-1][j];
if(L>R)for(j=0;j<L;j++)up(f[i][j>R?j:R],f[i-1][j]+1);
}
for(j=0;j<=ca;j++)up(ans,f[cb][j]);
ans=cb-ans;
if(ans>=m)puts("impossible");else printf("%d",ans);
return 0;
}
BZOJ5412 : circle的更多相关文章
- [翻译svg教程]svg中的circle元素
svg中的<circle> 元素,是用来绘制圆形的,例如 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink= ...
- 设计一个程序,程序中有三个类,Triangle,Lader,Circle。
//此程序写出三个类,triangle,lader,circle:其中triangle类具有类型为double的a,b,c边以及周长,面积属性, //具有周长,面积以及修改三边的功能,还有判断能否构成 ...
- c++作业:Circle
Circle Github链接
- Modified Least Square Method and Ransan Method to Fit Circle from Data
In OpenCv, it only provide the function fitEllipse to fit Ellipse, but doesn't provide function to f ...
- [javascript svg fill stroke stroke-width circle 属性讲解] svg fill stroke stroke-width circle 属性 绘制圆形及引入方式讲解
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- (1)编写一个接口ShapePara,要求: 接口中的方法: int getArea():获得图形的面积。int getCircumference():获得图形的周长 (2)编写一个圆类Circle,要求:圆类Circle实现接口ShapePara。 该类包含有成员变量: radius:public 修饰的double类型radius,表示圆的半径。 x:private修饰的double型变量x,
package com.hanqi.test; //创建接口 public interface ShapePara { //获取面积的方法 double getArea(); //获取周长的方法 do ...
- 东大oj-1591 Circle of friends
题目描述 Nowadays, "Circle of Friends" is a very popular social networking platform in WeChat. ...
- svg学习(四)circle
<circle> 标签 < <?xml version="1.0" standalone="no"?> <!DOCTYPE ...
- 后缀数组 --- WOj 1564 Problem 1564 - A - Circle
Problem 1564 - A - Circle Problem's Link: http://acm.whu.edu.cn/land/problem/detail?problem_id=156 ...
随机推荐
- jmeter 压力测试安装教程
条件: 安装java8,没有安装点击:https://www.cnblogs.com/xdtx/p/10188767.html 进入官网下载:http://jmeter.apache.org/ 配置环 ...
- git上传到版本库报错:Pull is not possible because you have unmerged files(已解决)
问题所在:操作次数太多,第一次报错之删掉了.git并没有删除下面两个文件 才报了题述错误. 解决办法: 将这三个文件都删除在重新运行所有指令.
- 让你的Spring Boot应用快速运行在Docker上面
前置条件: 1. 服务器(我这边是CentOS7)上已经安装了Docker(安装步骤很简单,可以参考我上一篇博客) 2.服务器上已经安装了Java和Maven 在满足以上条件后,我们就可以开始了: 1 ...
- C# 最全的文件工具类FileHelper
using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Lin ...
- Go依赖模块版本之Module避坑使用详解
前提 对于Go的版本管理主要用过 glide,下面介绍 Go 1.11 之后官方支持的版本管理工具 mod. 关于 mod 官方给出了三个命令 go help mod.go help modules. ...
- python脚本--mysql数据库升级、备份
在公司经常要做测试环境的升级.备份.维护:升级后台的应用,不可避免要进行数据库的升级与备份,花了一个上午琢磨了一个脚本分享给大家. ToB的业务,在做环境维护的时候,有初始化环境和增量升级的环境,在测 ...
- 十五丶IO model
事件驱动模型 上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么确定IO操作完了? 很多程序员可能会考虑使用“线程池”或“连接池”.“线程池”旨在减少创建和销毁线程的频率,其维持一定合 ...
- js原型与原型链探究
原型有一个非常重要的属性叫 prototype 一.先写一个简单的例子,看看 A的原型和A的实例 分别是什么 function A() {} var a = new A() console.log(a ...
- 浅谈Java线程安全
浅谈Java线程安全 - - 2019-04-25 17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...
- java笔记(Idea,Maven):误删maven项目的target的class,怎么再生成target
右边侧边栏clean一下,target目录删掉了.或是手动删掉了.再建. 跑一下 Tomcat. target自动生成. 就这样.:)