正题

题目链接:https://www.luogu.com.cn/problem/P6134


题目大意

给出一张nnn个点mmm条边的DAGDAGDAG。求联通情况不变的情况下最多删除几条边。

1≤n≤3×104,0≤M≤1051\leq n\leq 3\times 10^4,0\leq M\leq 10^51≤n≤3×104,0≤M≤105


解题思路

拓扑排序后,如果确定了后面若干个的最优解,那么不会影响到前面的决策,我们只需要对于每个点考虑删除最多的出边即可。

从后往前枚举,对于一个点连接的集合EEE,按照拓扑序从小到大排后,每次加入一个点和它所有连接的点,如果该点已经联通,那么这条边就可以删除了。

用bitsetbitsetbitset可以快速实现这个过程。

时间复杂度O(mnw)O(\frac{mn}{w})O(wmn​)


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,拓扑排序】相关推荐

  1. P6134 [JSOI2015]最小表示(拓扑排序递推 + bitset优化,可达性统计变种)

    整理的算法模板合集: ACM模板 P6134 [JSOI2015] 题目要求删除一条边整个图的连通性是不受影响的,也就是说如果我们要删除边(x,y)(x,y)(x,y),删除以后整个图的连通性不受影响 ...

  2. 拓扑排序--猫猫向前冲

    问题描述: 众所周知, TT 是一位重度爱猫人士,他有一只神奇的魔法猫. 有一天,TT 在 B 站上观看猫猫的比赛.一共有 N 只猫猫,编号依次为1,2,3,-,N进行比赛.比赛结束后,Up 主会为所 ...

  3. 中石油训练赛 - Swapping Places(字典序最小的拓扑排序)

    题目链接:点击查看 题目大意:给出 s 个字符串表示种类,再给出 m 个朋友关系,表示两个种类的动物是朋友,现在给出一个长度为 n 的种类排列,规定相邻两个是朋友的种类的动物可以交换位置,问如何操作, ...

  4. 164. 可达性统计【拓扑排序 / bitset】

    无环说明一定有拓扑排序. 我们得到拓扑排序,倒着推.注意压位. #include<bits/stdc++.h> #include<bitset> using namespace ...

  5. 拓扑排序(字典序最小,字典序最小)

    E. Minimal Labels 题意: 给出 m 条有向边,组成有向无环图,输出一个 1 到 n 组成的排列,每个数只能出现一次,表示每个点的标号.如果有边 (u,v)(u,v) 那么 label ...

  6. 拓扑排序----Kahn算法和字典序最小的拓扑排序

    一.拓扑排序定义: 二.卡恩算法(Kahn): 1.Kahn算法介绍: 有向无环图DAG至少具有一个度数为0的顶点和一个度数为0的顶点. 证明:上述事实有一个简单的证明,即DAG不包含循环,这意味着所 ...

  7. 核弹剑仙 (拓扑排序+bitset或最短路)

    题目链接:https://ac.nowcoder.com/acm/contest/6874/F 题意: 题解:参考了大佬的代码后,得出了两种做法,第一种是拓扑排序,建图时将强的点指向弱的点,同时用bi ...

  8. leetcode 310. Minimum Height Trees | 310. 最小高度树(图的邻接矩阵DFS / 拓扑排序)

    题目 https://leetcode.com/problems/minimum-height-trees/ 题解 方法1:图的邻接矩阵 DFS(超时) 我一想,这不就是个图嘛,于是随手敲出一个 DF ...

  9. 【图论专题】拓扑排序

    拓扑排序 给定一张有向无环图,若一个序列A满足图中的任意一条边(x,y)x都在y的前面呢么序列A就是图的拓扑排序 实际上拓扑排序就是满足所有的边x指向y,x一定在y的前面.这样按照拓扑排序递推,就可以 ...

最新文章

  1. 【Qt】QCamera查询和设置摄像头的分辨率
  2. VB调用C#写的WinForm.NET控件
  3. 告别刷抖音!30秒一个Python小例子,总有一款适合你
  4. NodeJS学习目录
  5. 搭建自己的博客(二十七):增加登录注册以及个人资料按钮
  6. 聊聊 | 他在Google Play安全奖励计划贡献榜单上排名第一
  7. Hype教程,如何设置字体样式?
  8. 拓端tecdat|Python进行多输出(多因变量)回归:集成学习梯度提升决策树GRADIENT BOOSTING REGRESSOR回归训练和预测可视化
  9. Linux 内存管理之 SLUB分配器(1): Object-layout
  10. 【C++】数列求和-加强版
  11. 联想Y400 拆光驱加装固态硬盘
  12. Selenium学习 - WebElement接口
  13. nohup sh xxx.sh /dev/null
  14. 结合北斗PPP_B2b 导航电文进行精密定位(PPP)
  15. c语言blackjack设计思路,写一个“BlackJack ”Java应用程序 该计划将测试你的逻辑思维。...
  16. Win7下连远程桌面 窗口 全屏 切换
  17. 刷机教程+android5,小米2刷机安卓5.1方法 小米2刷机android5.1教程详解
  18. jquery:选择器【基础选择器、层级选择器、属性选择器和方法操作、过滤选择器、筛选选择器和方法,可见性过滤选择器】
  19. Flutter TabBar
  20. C# 使用RestSharp实现Postman中的各种形式的请求

热门文章

  1. 语言怎么得到直流电压并采样_交流电AC如何转换成直流电DC?
  2. twitter mysql_twitter-mysql改进点
  3. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
  4. bios是固定在微型计算机上的一块RoM,计算机硬件笔试试题
  5. java collator_Java Collator compare(String, String)用法及代码示例
  6. 单片机矩阵消抖延时c语言,单片机矩阵按键定时器消抖程序源码
  7. c语言判断x的个位数是否为5,用C语言编程从键盘输入一个正整数,判断其个位数是否为5,若是5则输出“yes”,否则输出“no”...
  8. win10右键一直转圈_Win10电脑开机一直转圈无法进入系统的解决方法
  9. acwing——每日一题——总结
  10. php引用类,thinkphp引用类的使用