题意

给你一个 \(n\) 个点 \(m\) 条边的 \(\rm DAG\) ,询问最多能够删除多少条边,使得图的连通性不变

  • \(n\leq 3\times 10^4\ ,m\leq 10^5\) 。

分析

  • 假设有点 \(u,v,x\) ,且有边 \(u \rightarrow v,\ u \rightarrow x,\ x \rightarrow v\),那么此时 \(u \rightarrow v\) 这条边可以被删除。

  • 于是直接拓扑排序,利用 \(bitset\) 求出每个点可以到达的点集合可以被到达的点集。

  • 对于每个点再搞一个 \(bitset\) 表示这个点连了边的集合。

  • 如果一个点 \(v\) 可以被删除,那么显然\(u\) 可以从它连向的其他点走到 \(v\)。

    因为无环所以不存在双向依赖的关系,也就是说一条边能不能删并不被其他边是否能删所影响。

  • 总时间复杂度为 \(O(m*\frac{n}{32})\)。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
  4. #define rep(i,a,b) for(int i=a;i<=b;++i)
  5. #define pb push_back
  6. #define re(x) memset(x,0,sizeof x)
  7. typedef long long LL;
  8. inline int gi(){
  9. int x=0,f=1;char ch=getchar();
  10. while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
  11. while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
  12. return x*f;
  13. }
  14. template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
  15. template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
  16. const int N=1e5 + 7;
  17. int n,m,edc=1,ans;
  18. int head[N],ind[N];
  19. bitset<30004>to[30004],bto[30004],tmp;
  20. struct edge{
  21. int last,to;
  22. edge(){}edge(int last,int to):last(last),to(to){}
  23. }e[N*2];
  24. void Add(int a,int b){
  25. e[++edc]=edge(head[a],b),head[a]=edc;
  26. e[++edc]=edge(head[b],a),head[b]=edc;
  27. }
  28. int q[N],hd=1,tl;
  29. void topo(){
  30. rep(i,1,n) if(!ind[i]) q[++tl]=i;
  31. for(;hd<=tl;++hd){
  32. int u=q[hd];
  33. go(u)if(!(i&1))
  34. if(--ind[v]==0) q[++tl]=v;
  35. }
  36. for(int j=tl;j;--j){
  37. int u=q[j];to[u][u]=1;
  38. go(u)if(i&1) to[v]|=to[u];
  39. }
  40. for(int j=1;j<=tl;++j){
  41. int u=q[j];bto[u][u]=1;
  42. go(u)if(!(i&1)) bto[v]|=bto[u];
  43. }
  44. }
  45. int main(){
  46. n=gi(),m=gi();
  47. rep(i,1,m){
  48. int a=gi(),b=gi();
  49. Add(a,b);++ind[b];
  50. }
  51. topo();
  52. for(int u=1;u<=n;++u){
  53. tmp.reset();
  54. go(u)if(!(i&1)) tmp[v]=1;
  55. go(u)if(!(i&1)&&(tmp&bto[v]).count()>1) ++ans;
  56. }
  57. printf("%d\n",ans);
  58. return 0;
  59. }

[BZOJ4484][JSOI2015]最小表示[拓扑排序+bitset]的更多相关文章

  1. BZOJ4484: [Jsoi2015]最小表示(拓扑排序乱搞+bitset)

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 348  Solved: 172[Submit][Status][Discuss] Descriptio ...

  2. BZOJ 4484: [Jsoi2015]最小表示(拓扑排序+bitset)

    传送门 解题思路 \(bitset\)维护连通性,给每个点开个\(bitset\),第\(i\)位为\(1\)则表示与第\(i\)位联通.算答案时显然要枚举每条边,而枚举边的顺序需要贪心,一个点先到达 ...

  3. [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...

  4. BZOJ4484 JSOI2015最小表示(拓扑排序+bitset)

    考虑在每个点的出边中删除哪些.如果其出边所指向的点中存在某点能到达另一点,那么显然指向被到达点的边是没有用的.于是拓扑排序逆序处理,按拓扑序枚举出边,bitset维护可达点集合即可. #include ...

  5. NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset

    描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...

  6. P2805 [NOI2009]植物大战僵尸(最小割+拓扑排序)

    题意: n*m的矩阵,每个位置都有一个植物.每个植物都有一个价值(可以为负),以及一些它可以攻击的位置.从每行的最右面开始放置僵尸,僵尸从右往左行动,当僵尸在植物攻击范围内时会立刻死亡.僵尸每到一个位 ...

  7. CH 2101 - 可达性统计 - [BFS拓扑排序+bitset状压]

    题目链接:传送门 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条 ...

  8. BZOJ5109 CodePlus 2017大吉大利,晚上吃鸡!(最短路+拓扑排序+bitset)

    首先跑正反两遍dij求由起点/终点到某点的最短路条数,这样条件一就转化为f(S,A)*f(T,A)+f(S,B)*f(T,B)=f(S,T).同时建出最短路DAG,这样图中任何一条S到T的路径都是最短 ...

  9. HDU 1285 确定比赛名次【字典序最小的拓扑排序 + 优先队列】

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

随机推荐

  1. [控件] LiveChangedImageView

    LiveChangedImageView 效果 说明 切换图片的时候自动根据图片的尺寸进行渐变式切换,效果很不错,使用非常容易. 源码 https://github.com/YouXianMing/U ...

  2. RDMBorderedButton

    RDMBorderedButton https://github.com/reesemclean/RDMBorderedButton 效果: 源码: RDMBorderedButton.h + RDM ...

  3. [翻译] USING GIT IN XCODE [3] 在XCODE中使用GIT[3]

    USING GIT IN XCODE MAKING AND COMMITTING CHANGES Once you have a working copy of your project, it’s ...

  4. wxpython 编程触发菜单或按钮事件

    最近逐步熟悉wxpython,编写了几个小小功能的GUI程序,GUI中免不了会有在代码中触发控件事件的业务需求.在其他Gui界面的语言中有postevent.triggerevent 调用事件名称的函 ...

  5. JDBC方式执行SQL,支持CRUD返回LIST

    背景: 用惯了Mybatis,接收一个老项目使用Hibernate,特别不习惯.新的功能需要系统后台定时执行任务,顾使用JDBC封装工具类执行 源代码 import java.sql.Connecti ...

  6. Zabbix日常监控(win_agent方式)

    参考博文:https://www.cnblogs.com/xqzt/p/5130469.html https://www.cnblogs.com/zoulongbin/p/6395047.html 本 ...

  7. 使用yii的layout,加入<?php echo $content; ?>这句话时,它会自动在子页面上面添加一个div包裹

    使用yii的layout,加入<?php echo $content; ?>这句话时,它会自动在子页面上面添加一个div包裹,而且div的id命名为id=content,这个和已有id重复 ...

  8. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1

    java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1 mysql报错 ...

  9. JDBC 使用common-dbutiles

    一:第三方jar mysql-connector-java-5.1.45-bin.jar,需要关注的核心类: 1.DbUtils----操作数据库的连接注册和释放. 2:.QueryRunner--- ...

  10. [Nagios] Error: Template &#39;timman&#39; specified in contact definition could not be not found (c

    Check nagios配置文件报错例如以下: [nagios@2 etc]$ /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios ...