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

Solution

看的题解...感觉bitset这个东西就很少在我脑子里存在过...
因为是个dag考虑先拓扑一遍把拓扑序处理出来,一条边\((u,v)\)可删当且仅当存在点\(x\),有路径\(u->x\)和\(x->v\)。那么很容易看出删边是相互独立的。接下来就不会了...
题解是用的bitset维护点对之间的联通。按拓扑序逆序处理,每个点的出边所连的点的拓扑序肯定大于它,且拓扑序更小的对答案的贡献更大(因为拓扑序越小,可达点就越多),所以在处理之前把每个点的出边按\(v\)的拓扑序升序排序,那么每次对于边\((u,v)\),如果\(u\)已经可达\(v\)那么直接删除该边,否则给当前点\(u\)的可达集合或上\(v\)和\(v\)的可达集合。复杂度是\(O(\frac{nm}{w})\)

#include <bits/stdc++.h>
using namespace std;namespace io {
char buf[1<<21], *p1 = buf, *p2 = buf;
inline char gc() {if(p1 != p2) return *p1++;p1 = buf;p2 = p1 + fread(buf, 1, 1 << 21, stdin);return p1 == p2 ? EOF : *p1++;
}
#define G gc#ifndef ONLINE_JUDGE
#undef G
#define G getchar
#endiftemplate<class I>
inline void read(I &x) {x = 0; I f = 1; char c = G();while(c < '0' || c > '9') {if(c == '-') f = -1; c = G(); }while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = G(); }x *= f;
}template<class I>
inline void write(I x) {if(x == 0) {putchar('0'); return;}I tmp = x > 0 ? x : -x;if(x < 0) putchar('-');int cnt = 0;while(tmp > 0) {buf[cnt++] = tmp % 10 + '0';tmp /= 10;}while(cnt > 0) putchar(buf[--cnt]);
}#define in(x) read(x)
#define outn(x) write(x), putchar('\n')
#define out(x) write(x), putchar(' ')#undef G
} using namespace io;#define ll long long
const int N = 30010;bitset<N>f[N];
vector<int> G[N];
int du[N], n, m, id[N], q[N], w[N];void topsort() {int l = 1, r = 1, tim = 0;for(int i = 1; i <= n; ++i) if(!du[i]) q[r++] = i;while(l < r) {int u = q[l++];id[u] = ++tim;w[tim] = u;for(int i = 0, len = G[u].size(); i < len; ++i) {int v = G[u][i];du[v]--;if(!du[v]) q[r++] = v;}}
}bool cmp(int a, int b) {return id[a] < id[b];
}int main() {read(n); read(m);for(int i = 1, u, v; i <= m; ++i) {read(u); read(v);G[u].push_back(v);du[v]++;}topsort();int ans = 0;for(int i = n; i; --i) sort(G[i].begin(),G[i].end(),cmp);for(int i = n; i; --i) {int u = w[i];for(int j = 0, len = G[u].size(); j < len; ++j) {int v = G[u][j];if(f[u].test(id[v])) ++ans;else {f[u][id[v]] = 1;f[u] |= f[v];}}}outn(ans);
} 

转载于:https://www.cnblogs.com/henry-1202/p/11254895.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. Python3 使用replace 替换空格无效
  2. Windows API函数大全
  3. Android进阶:一、日志打印和保存策略
  4. ​冲刺最后一公里——音视频场景下的边缘计算实践
  5. linux 杀掉php,Linux_在Linux系统中使用xkill命令杀掉未响应的进程,我们如何在Linux中杀掉一个资 - phpStudy...
  6. java单链表查询功能,Java 实现简答的单链表的功能
  7. Linux网络配置:设置IP地址、网关DNS、主机名
  8. LeetCode-210 Course Schedule II
  9. ultrascale和arm区别_UltraScale+MPSoC软硬件设计及入门套件
  10. 数字逻辑实验一--组合逻辑电路的设计
  11. 悉尼大学计算机工程专业世界排名,悉尼大学世界排名及专业排名汇总(QS世界大学排名版)...
  12. 趣图:没想到 CSS 深灰色是这样的
  13. matlab gui gca,matlab和rest做GCA分析的不同
  14. 找出最长的有效括号内子括号的长度
  15. 快速入门Opentracing-cpp
  16. Tracup小提示:工作总是摸鱼、走神,您可能得了“成人多动症”?
  17. C++ Struct(结构体)详解
  18. 不用代码!手把手教你Excel构建数据分析预测模型!
  19. 冒泡排序(C语言版)
  20. 《数据结构》实验报告三:栈 队列

热门文章

  1. 推荐一款笔记软件 Notion
  2. html 毛笔书写效果,利用纯SVG+CSS keyframes animation动画实现手写毛笔字(书法)效果...
  3. UVa 10827 - Maximum sum on a torus
  4. 2021数学建模国赛A题思路
  5. eclipse建web工程的dynamic web module version 具体是什么意思
  6. 【论文阅读】Coupled Iterative Refinement for 6D Multi-Object Pose Estimation
  7. 关于在线评论有用性的论文研读笔记---31-40篇
  8. 冒泡排序(Bubble Sort)含gif动图
  9. php eot html,PHP eot
  10. 计算机图形学【GAMES-101】7、光线追踪原理(线面求交、预处理光追加速)