题意

给出一张DAG,要求删除尽量多的边使得连通性不变.(即:若删边前u到v有路径,则删边后仍有路径).点数30000,边数100000.

分析

如果从u到v有(u,v)这条边,且从u到v只有这一条路径,那么这条边必须保留.否则这条边一定可以删除.因为如果有不止一条路径从u到v,必然存在点x(x!=u,x!=v)使得u可到达x,x可到达v.而删边后必然也满足u可到达x,x可到达v,所以直接删掉(u,v)这条边就可以了.

刚才的分析已经给出了一个判定方法.既然如果有不止一条路径从u到v,必然存在点x(x!=u,x!=v)使得u可到达x,x可到达v,那么我们对每条边(u,v),枚举是否存在这样的x即可.这需要我们求出每个点能到达的点的集合,以及能到达这个点的集合.大力压位一波就好了.因为是DAG所以这个集合可以递推.复杂度O(nm/32).

其实这题是看内存猜算法系列,榜上清一色的120多兆,不是压位还能是啥

我是200多兆

  1. #include<cstdio>
  2. const int mod=1000000007;
  3. const int maxn=30005,maxm=200005;
  4. struct edge{
  5. int to,next;
  6. }lst[maxm],lst2[maxm];int len=1,first[maxn],len2=1,first2[maxn];
  7. void addedge(int a,int b){
  8. lst[len].to=b;lst[len].next=first[a];first[a]=len++;
  9. }
  10. void addedge2(int a,int b){
  11. lst2[len2].to=b;lst2[len2].next=first2[a];first2[a]=len2++;
  12. }
  13. int sz;
  14. int reach[maxn][maxn/32+2],from[maxn][maxn/32+2];
  15. int getbit(int u,int x){
  16. return (reach[u][x/32]>>(x&31))&1;
  17. }
  18. void revbit(int u,int x){
  19. reach[u][x/32]^=(1<<(x&31));
  20. }
  21. void revbit2(int u,int x){
  22. from[u][x/32]^=(1<<(x&31));
  23. }
  24. bool vis[maxn];
  25. void dfs(int x){
  26. if(vis[x])return;
  27. vis[x]=true;
  28. for(int pt=first[x];pt;pt=lst[pt].next){
  29. dfs(lst[pt].to);
  30. for(int i=0;i<sz;++i)reach[x][i]|=reach[lst[pt].to][i];
  31. }
  32. revbit(x,x);
  33. }
  34. void dfs2(int x){
  35. if(vis[x])return;
  36. vis[x]=true;
  37. for(int pt=first2[x];pt;pt=lst2[pt].next){
  38. dfs2(lst2[pt].to);
  39. for(int i=0;i<sz;++i)from[x][i]|=from[lst2[pt].to][i];
  40. }
  41. revbit2(x,x);
  42. }
  43. int main(){
  44. int n,m;scanf("%d%d",&n,&m);sz=(n+31)/32+1;
  45. for(int i=1,a,b;i<=m;++i){
  46. scanf("%d%d",&a,&b);
  47. addedge(a,b);addedge2(b,a);
  48. }
  49. for(int i=1;i<=n;++i)if(!vis[i])dfs(i);
  50. for(int i=1;i<=n;++i)vis[i]=0;
  51. for(int i=1;i<=n;++i)if(!vis[i])dfs2(i);
  52. for(int i=1;i<=n;++i)revbit(i,i),revbit2(i,i);
  53. int ans=0;
  54. for(int i=1;i<=n;++i){
  55. for(int pt=first[i];pt;pt=lst[pt].next){
  56. int y=lst[pt].to;
  57. for(int j=0;j<sz;++j){
  58. if(from[y][j]&reach[i][j]){
  59. ans++;break;
  60. }
  61. }
  62. }
  63. }
  64. printf("%d\n",ans);
  65. return 0;
  66. }

bzoj4484[JSOI2015]最小表示的更多相关文章

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

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

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

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

  3. [BZOJ4484][JSOI2015]最小表示[拓扑排序+bitset]

    题意 给你一个 \(n\) 个点 \(m\) 条边的 \(\rm DAG\) ,询问最多能够删除多少条边,使得图的连通性不变 \(n\leq 3\times 10^4\ ,m\leq 10^5\) . ...

  4. 4484: [Jsoi2015]最小表示(拓扑序+bitset维护连通性)

    4484: [Jsoi2015]最小表示 题目链接 题解: bitset的题感觉都好巧妙啊QAQ. 因为题目中给出的是一个DAG,如果\(u->v\)这条边可以删去,等价于还存在一个更长的路径可 ...

  5. [JSOI2015]最小表示

    题目大意:尽可能多地去掉一个有向无环图上的边,使得图的连通性不变. 思路:拓扑排序,然后倒序求出每个结点到出度为$0$的点的距离$d$,再倒序遍历每一个点$x$,以$d$为关键字对其出边降序排序,尝试 ...

  6. bzoj 4484 [Jsoi2015]最小表示——bitset

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4484 每个点上存一下它到每个点的连通性.用 bitset 的话空间就是 \( \frac{n ...

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

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

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. 【bzoj4484】【jsoi2015】最小表示

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

随机推荐

  1. 2016-2017-2 20155329 实验四 Android 开发

    2016-2017-2 20155329 实验四 Android 开发 ## 任务一:Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBI ...

  2. 后缀数组(SA)总结

    后缀数组(SA)总结 这个东西鸽了好久了,今天补一下 概念 后缀数组\(SA\)是什么东西? 它是记录一个字符串每个后缀的字典序的数组 \(sa[i]\):表示排名为\(i\)的后缀是哪一个. \(r ...

  3. 深度学习:参数(parameters)和超参数(hyperparameters)

    1. 参数(parameters)/模型参数 由模型通过学习得到的变量,比如权重和偏置 2. 超参数(hyperparameters)/算法参数 根据经验进行设定,影响到权重和偏置的大小,比如迭代次数 ...

  4. equals和==方法比较(二)--Long中equals源码分析

    接上篇,分析equals方法在Long包装类中的重写,其他类及我们自定义的类,同样可以根据需要重新equals方法. equals方法定义 equals方法是Object类中的方法,java中所有的对 ...

  5. 搜索引擎ElasticSearch系列(四): ElasticSearch2.4.4 sql插件安装

    一:ElasticSearch sql插件简介 With this plugin you can query elasticsearch using familiar SQL syntax. You ...

  6. Appium+python 自动发送邮件(2)(转)

    (原文:https://www.cnblogs.com/fancy0158/p/10056418.html) 移动端执行完测试case之后,通过邮件自动发送测试报告.大体流程如下: 1.通过unitt ...

  7. Python中abs()和math.fabs()区别

    描述:Python中fabs(x)方法返回x的绝对值.虽然类似于abs()函数,但是两个函数之间存在以下差异: abs()是一个内置函数,而fabs()在math模块中定义的. fabs()函数只适用 ...

  8. 使用PHP写ajax接口

    使用PHP写ajax接口 之前有学过php都是前后端没有分离的,所以也想去了解后端是怎么写出ajax接口的,可能问了别人或者上网找了很多资料都很有有点懵,或者说直接用TP或者lavarel这些后端框架 ...

  9. 第k小分数(二分值)

    //时间限制:10000ms //单点时限:1000ms //内存限制:256MB //描述 //给定N个不同的质数P1, P2, … PN.用它们作为分目可以组成(P1-1) + (P2-1) + ...

  10. CsvHelper文档-6类型转换

    CsvHelper文档-6类型转换 CsvHelper使用类型转换器来转换string到对象,或者对象到string: ITypeConverter 类型转换器的结构,必须实现: public int ...