Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 432  Solved: 223
[Submit][Status][Discuss]

Description

【故事背景】
还记得去年JYY所研究的强连通分量的问题吗?去年的题目里,JYY研究了对于有向图的“加边”问题。对于图论有着强烈兴趣的JYY,今年又琢磨起了“删边”的问题。
【问题描述】
对于一个N个点(每个点从1到N编号),M条边的有向图,JYY发现,如果从图中删去一些边,那么原图的连通性会发生改变;而也有一些边,删去之后图的连通性并不会发生改变。
JYY想知道,如果想要使得原图任意两点的连通性保持不变,我们最多能删掉多少条边呢?
为了简化一下大家的工作量,这次JYY保证他给定的有向图一定是一个有向无环图(JYY:大家经过去年的问题,都知道对于给任意有向图的问题,最后都能转化为有向无环图上的问题,所以今年JYY就干脆简化一下大家的工作)。

Input

输入一行包含两个正整数N和M。
接下来M行,每行包含两个1到N之间的正整数x_i和y_i,表示图中存在一条从x_i到y_i的有向边。
输入数据保证,任意两点间只会有至多一条边存在。
N<=30,000,M<=100,000

Output

输出一行包含一个整数,表示JYY最多可以删掉的边数。

Sample Input

5 6

1 2

2 3

3 5

4 5

1 5

1 3

Sample Output

2

HINT

Source

By 佚名上传

[Submit][Status][Discuss]

题解 :
        cmp函数:不加类型的话本地不会编译错误,(il好像也是);

删边互相之间是无影响的,所以可删就删,和顺序无关; 
        由于没有重边的无环DAG,一条边可删即这条边的u,v有另一种方式到达;
        DAG转成topsort序列,bitset优化N*M连通性dp
        $O( \frac{NM}{64} + M*logM)$
        //毕姥爷说得对,还是写一下的好,不然连bitset的空间都不会开(和vector一样);
        20181031

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<queue>
 6 #include<cmath>
 7 #include<vector>
 8 #include<stack>
 9 #include<map>
10 #include<bitset>
11 #define rg register
12 #define il inline
13 #define Run(i,l,r) for(int i=l;i<=r;i++)
14 #define Don(i,l,r) for(int i=l;i>=r;i--)
15 #define ll long long
16 #define ld long double
17 #define inf 0x3f3f3f3f
18 using namespace std;
19 const int N=30001 , M=100010;
20 bitset<N>f[N];
21 int n,m,o,hd[N],st[N],id[N],d[N],idx,q[N],t,w;
22 vector<int>g[N];
23 char gc(){
24     static char*p1,*p2,s[1000000];
25     if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
26     return(p1==p2)?EOF:*p1++;
27 }
28 int rd(){
29     int x=0; char c=gc();
30     while(c<'0'||c>'9')c=gc();
31     while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
32     return x;
33 }
34 il bool cmp(const int &a,const int &b){return id[a]<id[b];}
35 il void topsort(){
36     for(rg int i=1;i<=n;i++)if(!d[i])q[++w]=i;
37     while(t<w){
38         int u=q[++t];
39         st[id[u]=++idx]=u;
40         for(rg int i=0;i<(int)g[u].size();i++){
41             int v=g[u][i];
42             if(!--d[v]){
43                 q[++w]=v;
44             }
45         }
46     }
47 }
48 int main(){
49     freopen("in.in","r",stdin);
50     freopen("out.out","w",stdout);
51     n=rd(); m=rd();
52     for(rg int i=1,u,v;i<=m;i++){
53         u=rd(); v=rd();
54         g[u].push_back(v);
55         d[v]++;
56     }
57     topsort();
58     for(rg int i=1;i<=n;i++){
59         sort(g[i].begin(),g[i].end(),cmp);
60     }
61     int ans=0;
62     for(rg int i=n;i;i--){
63         int u=st[i];
64         for(rg int j=0;j<(int)g[u].size();j++){
65             int v=g[u][j];
66             if(f[u].test(id[v])){
67                 ans++;
68             }else{
69                 f[u][id[v]]=1;
70                 f[u]|=f[v];
71             }
72         }
73     }
74     cout<<ans<<endl;
75     return 0;
76 }//by tkys_Austin;

View Code

转载于:https://www.cnblogs.com/Paul-Guderian/p/9901991.html

【bzoj4484】【jsoi2015】最小表示相关推荐

  1. bzoj4484[JSOI2015]最小表示

    题意 给出一张DAG,要求删除尽量多的边使得连通性不变.(即:若删边前u到v有路径,则删边后仍有路径).点数30000,边数100000. 分析 如果从u到v有(u,v)这条边,且从u到v只有这一条路 ...

  2. [BZOJ4484][JSOI2015]最小表示(拓扑排序+bitset)

    有一个结论:对于边<u,v>,若这是u到v的唯一路径,则这条边显然不可被删去,否则必然可以被删去. 因为若u到v还有其它路径,则必然是从u到某个点x再到v,由于最终答案中连通性不变,也就是 ...

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

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

  4. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  5. 伍六七带你学算法 入门篇-最小的k个数

    java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...

  6. 剑指offer 40.最小的 K 个数 python代码

    题目 寻找数组中的最小的k个数,也叫topk问题. 牛客网测试地址 注意: 牛客网的提交需要将最终的结果排序 思路 快速排序的 partition() 方法,会返回一个整数 j 使得 a[l-j-1] ...

  7. 支持向量机SVM序列最小优化算法SMO

    支持向量机(Support Vector Machine)由V.N. Vapnik,A.Y. Chervonenkis,C. Cortes 等在1964年提出.序列最小优化算法(Sequential ...

  8. LeetCode简单题之最小绝对差

    题目 给你个整数数组 arr,其中每个元素都 不相同. 请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回. 示例 1: 输入:arr = [4,2,1,3] 输出:[[1,2],[2,3],[ ...

  9. LeetCode简单题之二叉搜索树的最小绝对差/最小距离

    题目 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 差值是一个正数,其数值等于两值之差的绝对值. 示例 1: 输入:root = [4,2,6,1,3] 输出: ...

  10. LeetCode简单题之打折购买糖果的最小开销

    题目 一家商店正在打折销售糖果.每购买 两个 糖果,商店会 免费 送一个糖果. 免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 . 比方说,总共有 4 个糖果,价格分别为 ...

最新文章

  1. Flink在快手实时多维分析场景的应用
  2. mysql 类型转换 cast 将 float 转换为 decimal
  3. linux who命令实现,linux下 who命令(3)(示例代码)
  4. 架构书籍推荐:Java中高级、架构师值得一读!
  5. a标签的href传递信息
  6. android 广播 关闭对话框,Android 对话框、信息提示和菜单
  7. windows文件迁移到linux,从Windows到Linux迁移之文件服务器(Samba和AD完美结合)
  8. 怎样用springboot开发cs_springboot 系列 springboot 初探
  9. 使用Eclipse创建的第一个javabean,cannot resolved to a type
  10. python-视频抽帧、数据集命名
  11. 可达性分析之三色标记算法详解
  12. jvm垃圾回收机制查看及说明
  13. python for maya教程_Python for Maya Fundamentals
  14. 【Docker社区大会】WebAssembly:无需容器的 Docker——VMware技术总监 Daniel Lopez
  15. matlab中P代码即P文件加密与逆向工程探讨
  16. 原来国家的名字可以如此浪漫(the Romantic Name of a Country)
  17. html图片底部显示,html – 将背景图像保持在底部
  18. RV1126RV1109 buildroot 增加GPIO测试程序
  19. chromedriver与GOOGLE浏览器对应版本
  20. 轻松解决keil4跟keil5在同一个系统下不能共存的问题

热门文章

  1. 程序员技术入股的那些坑
  2. 以太坊 2.0:验证者详解
  3. ept技术_每天5分钟跟我一起学电气之EPT的原理
  4. 大鱼吃小鱼java源代码_大鱼吃小鱼 JAVA游戏源码
  5. 官宣一一塔米狗企业并购图谱功能上线啦
  6. wordpress网站设计入门6 菜单式样设置
  7. Apple个人开发者账号相关问题
  8. 字节跳动:雀魂启动!(Python语言实现)
  9. 【Asan】新鲜货:使用ASan检测内存越界问题
  10. 无条件呼叫前转接已启用