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;
}

最新文章

  1. 1Z0-053 争议题目解析510
  2. spa 单页面解决浏览器back front 问题
  3. fw: webdriver 那些坑
  4. CSS鼠标响应事件经过、移动、点击示例介绍
  5. Android Studio调试功能使用总结
  6. ld - linker
  7. Docker:使用Ambassador进行跨主机间容器通信
  8. YCbCr
  9. bzoj4160: [Neerc2009]Exclusive Access 2
  10. thinkphp框架的路径问题 - 总结
  11. js中使用jstl中得到的值
  12. SE 2014年4月8日
  13. delphi 输入文件相对路径的更改,更改成用户的
  14. java实现文件转换成二进制存储与取出
  15. 也来谈谈IT培训
  16. HDU 5752 Sqrt Bo【枚举,大水题】
  17. java_BufferedReader的一个应用
  18. BCC校验小知识
  19. Genymotion模拟器出现INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法
  20. 2018ACM-ICPC焦作区域赛【反思总结】

热门文章

  1. #ifndef #define #endif
  2. IRQL
  3. python对图片批量命名
  4. ASP.NET Core如何在ActionFilterAttribute里做依赖注入
  5. Eureka比Zookeeper好在哪里?
  6. StringToKenizer和Scanner的区别
  7. Go语言系列教程(十二)之函数完结篇
  8. TensorFlow学习笔记——cmd调用方法
  9. ASp.net Core EF ActionFilterAttribute AOP
  10. 彻底搞懂Javascript的this