Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 103  Solved: 65

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 佚名上传

图论 拓扑排序 bitset

将有向图拓扑排序,易知每条有向边只会从拓扑序小的点连向拓扑序大的点。

按照拓扑序倒序处理每一个点,将当前点指向的所有点按拓扑序从小到大排序,贪心加边,若当前目标点已经被连通,就不需要加这条边。

用bitset维护连通性十分方便。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<bitset>
 7 using namespace std;
 8 const int mxn=100010;
 9 int read(){
10     int x=0,f=1;char ch=getchar();
11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
13     return x*f;
14 }
15 struct edge{
16     int v,nxt;
17 }e[mxn<<1];
18 int hd[mxn],mct=0;
19 void add_edge(int u,int v){
20     e[++mct].v=v;e[mct].nxt=hd[u];hd[u]=mct;return;
21 }
22 int q[mxn],hed,tl;
23 int ind[mxn],id[mxn];
24 int n,m;
25 void topo(){
26     hed=1;tl=0;
27     for(int i=1;i<=n;i++)if(!ind[i])q[++tl]=i;
28     while(hed<=tl){
29         int u=q[hed];hed++;
30         for(int i=hd[u];i;i=e[i].nxt){
31             int v=e[i].v;
32             --ind[v];
33             if(!ind[v]){q[++tl]=v;}
34         }
35     }
36     for(int i=1;i<=tl;i++)id[q[i]]=i;
37     return;
38 }
39 int cmp(int a,int b){
40     return id[a]<id[b];
41 }
42 bitset<30010>b[30010];
43 int st[mxn],top=0;
44 int ans=0;
45 void solve(){
46     int i,j;
47     for(i=tl;i;i--){
48         int u=q[i];
49         b[u][u]=1;top=0;
50         for(int j=hd[u];j;j=e[j].nxt)
51             st[++top]=e[j].v;
52         sort(st+1,st+top+1,cmp);
53         for(int j=1;j<=top;j++){
54             if(b[u][st[j]])ans++;
55             else b[u]|=b[st[j]];
56         }
57     }
58     printf("%d\n",ans);
59     return;
60 }
61 int main(){
62 //  freopen("in.txt","r",stdin);
63     int i,j,u,v;
64     n=read();m=read();
65     for(i=1;i<=m;i++){
66         u=read();v=read();
67         add_edge(u,v);
68         ++ind[v];
69     }
70     topo();
71     solve();
72     return 0;
73 }

转载于:https://www.cnblogs.com/SilverNebula/p/6925121.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. JoVE微生物组专刊征稿,写方法拍视频教程发SCI
  2. 多通道ADC一致性的高精度测量方法
  3. 手把手教学电瓶车进电梯检测、多类别车辆追踪、异常行为检测产业级应用
  4. python pdb 调试
  5. 2021年中国以太网转换器市场趋势报告、技术动态创新及2027年市场预测
  6. Nginx关于日志记录实例应用
  7. python文本交换_有没有办法用python交换文本文件中的两行文本?
  8. 计算机在资产管理中的应用,浅析计算机在学校固定资产管理中的应用
  9. ACDsee_14中文许可证秘钥
  10. 超级详细的IDEA设置Java类和方法的注释模板
  11. android 监测usb有线网卡的网线连接状态 详细一点的输出信息解析
  12. Minimum Snap闭式求解相关公式推导
  13. 嵌入式系统开发-麦子学院(13)-linux底层系统开发(1)
  14. Xshell改字体大小及颜色
  15. azure服务器_如何使用Azure Functions和SendGrid构建无服务器报表服务器
  16. .Net 5中对于http请求的压缩和解压缩(GZip,Brotli)
  17. 【热搜】想卷深度学习必会的10题【最全AI面经】
  18. 好好爱自己,胜过千言万语
  19. InteliJ IDEA社区版 两款插件变身旗舰版
  20. Spring Batch之读数据—读带有头文件的文件(三十一)

热门文章

  1. 程序员“真实”日常:每天敲代码不到 1 小时
  2. xy苹果助手未受信任_苹果ios企业签名后App无法安装?如何解决?
  3. citrix vdi 服务器性能要求,如何评估VDI存储要求
  4. 软件工程师必须掌握的知识结构
  5. 基于Java Web的房屋出租管理系统
  6. 2017.03.24回顾 归一化 标准化 R2 date_format 共线性 系数检验 决策树
  7. 笔记本电脑开机黑屏没反应怎么办
  8. 测试环境的搭建和维护_软硬件测试环境
  9. pdf文档页码怎么添加
  10. c语言文件分割与合并