P6134-[JSOI2015]最小表示【bitset,拓扑排序】
正题
题目链接:https://www.luogu.com.cn/problem/P6134
题目大意
给出一张\(n\)个点\(m\)条边的\(DAG\)。求联通情况不变的情况下最多删除几条边。
\(1\leq n\leq 3\times 10^4,0\leq M\leq 10^5\)
解题思路
拓扑排序后,如果确定了后面若干个的最优解,那么不会影响到前面的决策,我们只需要对于每个点考虑删除最多的出边即可。
从后往前枚举,对于一个点连接的集合\(E\),按照拓扑序从小到大排后,每次加入一个点和它所有连接的点,如果该点已经联通,那么这条边就可以删除了。
用\(bitset\)可以快速实现这个过程。
时间复杂度\(O(\frac{mn}{w})\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<queue>
#include<vector>
using namespace std;
const int N=3e4+10;
int n,m,cnt,tot,ans;
int in[N],ls[N],top[N],tfn[N];
queue<int> q;vector<int> v;
bitset<N> b[N];
struct node{
int to,next;
}a[N<<2];
void addl(int x,int y){
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;return;
}
void topsort(){
for(int i=1;i<=n;i++)
if(!in[i])q.push(i);
while(!q.empty()){
int x=q.front();q.pop();
top[++cnt]=x;tfn[x]=cnt;
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
in[y]--;
if(!in[y])q.push(y);
}
}
return;
}
bool cmp(int x,int y)
{return tfn[x]<tfn[y];}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
addl(x,y);in[y]++;
}
topsort();
for(int p=n;p>=1;p--){
int x=top[p];v.clear();b[x][x]=1;
for(int i=ls[x];i;i=a[i].next)
v.push_back(a[i].to);
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++){
int y=v[i];
if(b[x][y]) ans++;
else b[x]|=b[y];
}
}
printf("%d\n",ans);
}
P6134-[JSOI2015]最小表示【bitset,拓扑排序】的更多相关文章
- BZOJ4484 JSOI2015最小表示(拓扑排序+bitset)
考虑在每个点的出边中删除哪些.如果其出边所指向的点中存在某点能到达另一点,那么显然指向被到达点的边是没有用的.于是拓扑排序逆序处理,按拓扑序枚举出边,bitset维护可达点集合即可. #include ...
- 4484: [Jsoi2015]最小表示(拓扑序+bitset维护连通性)
4484: [Jsoi2015]最小表示 题目链接 题解: bitset的题感觉都好巧妙啊QAQ. 因为题目中给出的是一个DAG,如果\(u->v\)这条边可以删去,等价于还存在一个更长的路径可 ...
- bzoj 4484 [Jsoi2015]最小表示——bitset
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4484 每个点上存一下它到每个点的连通性.用 bitset 的话空间就是 \( \frac{n ...
- 拓扑排序详解(梅开二度之dfs版按字典序输出拓扑路径+dfs版输出全部拓扑路径
什么是拓扑排序? 先穿袜子再穿鞋,先当孙子再当爷.这就是拓扑排序! 拓扑排序说白了其实不太算是一种排序算法,但又像是一种排序(我是不是说了个废话qwq) 他其实是一个有向无环图(DAG, Direct ...
- BZOJ4484: [Jsoi2015]最小表示(拓扑排序乱搞+bitset)
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 348 Solved: 172[Submit][Status][Discuss] Descriptio ...
- [BZOJ4484][JSOI2015]最小表示[拓扑排序+bitset]
题意 给你一个 \(n\) 个点 \(m\) 条边的 \(\rm DAG\) ,询问最多能够删除多少条边,使得图的连通性不变 \(n\leq 3\times 10^4\ ,m\leq 10^5\) . ...
- 【BZOJ-1565】植物大战僵尸 拓扑排序 + 最小割
1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1972 Solved: 917[Submit][Statu ...
- NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset
描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...
- [BZOJ1565][NOI2009]植物大战僵尸-[网络流-最小割+最大点权闭合子图+拓扑排序]
Description 传送门 Solution em本题知识点是用网络流求最大点权闭合子图. 闭合图定义:图中任何一个点u,若有边u->v,则v必定也在图中. 建图:运用最小割思想,将S向点权 ...
随机推荐
- 微信小程序自定义顶部
wxml <view style="height:{{titleHeight}}px;background:{{background}}" class="user- ...
- Linux中Java开发常用的软件总结:
开发工具下载: Tomcat下载:wget http://learning.happymmall.com/tomcat/apache-tomcat-7.0.73.tar.gzJDK下载: wget h ...
- MySql 文件导入导出
1.将表输出到文件 select * FROM zhilianzhaopin4 INTO OUTFILE 'G:/test.csv' --------输出位置 fields terminat ...
- Hibernate脑图
- jQuery中的文档操作处理(五):append()、prepend()、after()、before()、wrap()、wrapAll()、wrapInner()、clone()等
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- Vue状态管理模式---Vuex
1. Vuex是做什么的? 官方解释: Vuex 是一个专为Vue.js 应用程序开发的 状态管理模式 它采用 集中式存储管理 应用的所有组件的状态, 并以相应的规则保证状态以一种可预测的方式发生变化 ...
- kettle 乱码问题处理方案
一.同下图加上 "-Dfile.encoding=UTF-8" ,两都都加没有试过,可先加一处,如果没有处理到问题,再加另外一处
- Ubuntu下 QT中配置ROS-Kinetic
打开qtcreater自动加载ros环境,通过修改*.desktop文件 gedit ~/.local/share/applications/qtcreator.desktop 将其中Exec=XXX ...
- Tomcat 端口配置及原理详解
1. tomcat 文件配置详细说明 tomcat服务器需配置三个端口才能启动,安装时默认启用了这三个端口,当要运行多个tomcat服务时需要修改这三个端口,不能相同.端口配置路径为tomcat\ c ...
- Servlet学习笔记(三)之HttpServletRequest
HttpServletRequest(HttpServletRequest 想比 ServletRequest 添加与协议相关 API)对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HT ...