4484: [Jsoi2015]最小表示

题目链接

题解:

bitset的题感觉都好巧妙啊QAQ。

因为题目中给出的是一个DAG,如果\(u->v\)这条边可以删去,等价于还存在一个更长的路径可以使得\(u\)到\(v\)。

这里的“更长”我们可以用拓扑序来搞,拓扑序大的相对于起点也肯定更长。那么思路就是对于每个点考虑删掉其出边,并且枚举边的时候拓扑序是从小到大的,然后来检验连通性。

但如果我们按照拓扑序来搞的话,很显然是错的。我们其实可以直接按着拓扑序反着来。这样的话后面点的连通性很容易知道,并且当前点与后面点的连通性也容易维护。

感觉拓扑序这种东西有点神奇,反着来经常能消除一些东西的影响,但具体什么我也不清楚QWQ。可能这样阶段划分清晰一点?反着来已处理过的与正在处理的关系是明确的,正着来正在处理的与后面的关系就不是很明确,就不是很容易维护信息。

如果有大佬知道可以给我明确一下。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <bitset>
#include <queue>
using namespace std;
typedef long long ll;
const int N = 30005, M = 100005;
int n, m;
int in[N];
bitset <N> s[N] ;
struct Edge{
int v, next ;
}e[M];
int head[N], tot;
void adde(int u, int v) {
e[tot].v = v; e[tot].next = head[u]; head[u] = tot++;
}
int vist[N], t[N], a[N], b[N];
int T;
void Topsort() {
queue <int> q;
for(int i = 1; i <= n; i++) if(!in[i]) q.push(i) ;
while(!q.empty()) {
int u = q.front(); q.pop() ;
vist[u] = ++T;
t[T] = u;
for(int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].v;
if(--in[v] == 0) q.push(v) ;
}
}
}
bool cmp(int x, int y) {
return vist[x] > vist[y] ;
}
int ans ;
void work(int u) {
int tot = 0;
s[u].set(u) ;
for(int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].v;
b[++tot] = v;
}
sort(b + 1, b + tot + 1, cmp) ;
for(int i = tot; i >= 1; i--) {
if(s[u][b[i]]) ans++;
else s[u] |= s[b[i]] ;
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(0) ;
cin >> n >> m;
memset(head, -1, sizeof(head)) ;
for(int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
adde(u, v) ;++in[v] ;
}
Topsort() ;
for(int i = 1; i <= n; i++) a[i] = i;
sort(a + 1, a + n + 1, cmp) ;
for(int i = 1; i <= n; i++) work(a[i]) ;
cout << ans ;
return 0;
}

4484: [Jsoi2015]最小表示(拓扑序+bitset维护连通性)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [JSOI2015]最小表示

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

  7. 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)

    3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved:  ...

  8. poj3553 拓扑序+排序贪心

    题意:有多个任务,每个任务有需要花费的时间和最后期限,任务之间也有一些先后关系,必须先完成某个才能开始某个,对于每个任务,如果没有越期,则超时为0,否则超时为结束时间-最后期限,求总超时时间最小的任务 ...

  9. poj3687 拓扑序

    题意:有编号 1-n 的球,每个球的质量不同,质量从 1 到 n 不等,给出一系列比较,分别是两个编号的球的大小关系,求一个序列满足上述关系,并且从编号 1 开始依次选择可选的最小质量,输出每个球的质 ...

随机推荐

  1. 2018-2019-2 网络对抗技术 20165230 Exp7 网络欺诈防范

    实验目的 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 实验内容 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术,用DNS sp ...

  2. 展示时测试Markdown渲染

    \begin{equation} %公式 Speedup_{overall} = \frac{1}{{(1-Fraction_{partitioned})} +\frac{Fraction_{part ...

  3. 重启nova-scheduler服务,报错Login was refused using authentication mechanism AMQPLAIN

    问题描述 运行 systemctl restart openstack-nova-scheduler.service 失败,查看日志报错如下: 2019-12-22 14:52:27.426 1513 ...

  4. Docker底层基石namespace与cgroup

    Docker底层基石namespace与cgroup   容器本质上是把系统中为同一个业务目标服务的相关进程合成一组,放在一个叫做namespace的空间中,同一个namespace中的进程能够互相通 ...

  5. AQS1---走向稳定态

    AQS的思想(稳定思想):即使确定了正常节点,这个节点也可能下一秒异常,即使找到了正常节点,这个节点可能只是异常status=0/-1的节点,这些都不要紧,都只是在自己旋转‘生命周期’里面和自己所看到 ...

  6. [工具]法国神器mimikatz 2.1.1 一键版 & PowerShell版

    无需任何参数,运行EXE即可自动读取Windows系统密码 EXE版需要其它功能请使用原版 (参数已写死仅读密码) 结果保存于当前目录mz.log EXE https://github.com/k8g ...

  7. redis的setIfAbsent

    setIfAbsent(K key, V value) 如果键不存在则新增,存在则不改变已经有的值.

  8. U9数据权限分配枚举值方法

    1.配置动态视图,定位应用对应控制实体,并设置动态视图类型:读取 或 增.删.改: 2.设置动态视图条件:MOPickList.MO.DocState.Value in (FunEnum('生产订单单 ...

  9. BZOJ3145 [Feyat cup 1.5]Str 后缀树、启发式合并

    传送门--BZOJCH 考虑两种情况: 1.答案由一个最长公共子串+可能的一个模糊匹配位置组成.这个用SAM求一下最长公共子串,但是需要注意只出现在\(S\)的开头和\(T\)的结尾的子串是不能够通过 ...

  10. HDFS 其他命令---fsck

    HDFS 其他命令 HDFS支持fsck命令用以检查各种不一致.fsck用以报告各种文件问题,如 block丢失或缺少block等.fack 命令用法如下: hdfs fsck <path> ...