还是很好些的.

Code:

  1. #include <stack>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <queue>
  5. #include <cstring>
  6. #include <map>
  7. #define setIO(s) freopen(s".in","r",stdin)
  8. using namespace std;
  9. namespace Tarjan{
  10. #define maxn 1000000
  11. #define ll long long
  12. map<int,int>ed[maxn];
  13. int scc,sig;
  14. int vis[maxn];
  15. int du[maxn];
  16. int idx[maxn];
  17. int pre[maxn],low[maxn];
  18. int val[maxn];
  19. long long value[maxn];
  20. long long ans[maxn];
  21. stack<int>S;
  22. queue<int>Q;
  23. struct graph{
  24. int cnt;
  25. int head[maxn],to[maxn<<1],nex[maxn<<1];
  26. void addedge(int u,int v){
  27. nex[++cnt] = head[u],head[u]=cnt,to[cnt] = v;
  28. }
  29. }G1,G2;
  30. void tarjan(int u){
  31. S.push(u);
  32. vis[u] = 1;
  33. pre[u] = low[u] = ++scc;
  34. for(int v=G1.head[u];v;v=G1.nex[v]){
  35. if(!vis[G1.to[v]]) {
  36. tarjan(G1.to[v]);
  37. low[u] = min(low[u],low[G1.to[v]]);
  38. }
  39. else if(vis[G1.to[v]] == 1) low[u] = min(low[u],pre[G1.to[v]]);
  40. }
  41. if(pre[u] == low[u]) {
  42. ++sig;
  43. for(;;){
  44. int a=S.top(); S.pop();
  45. vis[a] = -1,idx[a] = sig;
  46. value[sig] += (ll)val[a];
  47. if(a==u) break;
  48. }
  49. }
  50. }
  51. void toposort(){
  52. for(int i=1;i<=sig;++i)
  53. for(int j=G2.head[i];j;j=G2.nex[j]) ++du[G2.to[j]];
  54. for(int i=1;i<=sig;++i) if(du[i]==0) Q.push(i),ans[i] = value[i];
  55. while(!Q.empty()){
  56. int u=Q.front(); Q.pop();
  57. for(int v=G2.head[u];v;v=G2.nex[v]){
  58. ans[G2.to[v]] = max(ans[G2.to[v]],ans[u] + value[G2.to[v]]);
  59. --du[G2.to[v]];
  60. if(du[G2.to[v]]==0) Q.push(G2.to[v]);
  61. }
  62. }
  63. long long fin=0;
  64. for(int i=1;i<=sig;++i)
  65. fin=max(fin,ans[i]);
  66. printf("%lld",fin);
  67. }
  68. int main(){
  69. int n,m,a,b;
  70. scanf("%d%d",&n,&m);
  71. for(int i=1;i<=n;++i) scanf("%d",&val[i]);
  72. for(int i=1;i<=m;++i) {
  73. scanf("%d%d",&a,&b);
  74. G1.addedge(a,b);
  75. }
  76. for(int i=1;i<=n;++i) if(!vis[i]) tarjan(i);
  77. for(int i=1;i<=n;++i)
  78. for(int v=G1.head[i];v;v=G1.nex[v])
  79. if(idx[i]!=idx[G1.to[v]] && !ed[idx[i]][idx[G1.to[v]]])
  80. G2.addedge(idx[i],idx[G1.to[v]]),ed[idx[i]][idx[G1.to[v]]]=1;
  81. toposort();
  82. return 0;
  83. }
  84. };
  85. int main(){
  86. Tarjan::main();
  87. return 0;
  88. }

  

luogu P3387 【模板】缩点_拓扑排序的更多相关文章

  1. b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子图

    b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子 题意:n*m个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...

  2. BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心

    BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...

  3. [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...

  4. 【模拟7.16】通讯(tarjan缩点加拓扑排序)

    这题确实水,纯板子,考试意外出错,只拿了暴力分QAQ tarjan缩点加上拓扑排序,注意这里求最短路径时不能用最小生成树 因为是单向边,不然就可能不是一个联通图了.... 1 #include< ...

  5. 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)

    Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...

  6. P3387缩点(tarjan+拓扑排序+线性dp)

    题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...

  7. 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Stat ...

  8. NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset

    描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...

  9. [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...

随机推荐

  1. day25-2 random,os,sys模块

    目录 random 为什么要有random模块,random模块有什么用 os 为什么要有os模块,os模块有什么用 sys 为什么要有sys模块,sys模块有什么用 random import ra ...

  2. nginx日志按日期自动切割脚本

    #!/bin/bash #nginx日志切割脚本 #author:setevn #设置日志文件存放目录 logs_path="/usr/local/nginx/logs/" #设置 ...

  3. js中时间戳与日期时间之间的相互转换

    1.时间戳转换为标准日期时间格式: function timeFormat(dateStr) { var date = new Date(dateStr); Y = date.getFullYear( ...

  4. 洛谷P3960 列队 Splay

    其实思路并不算太难,就是代码量相对较大. 我们将一次离队转换为一次删除和两次加入,这样就可以保证空间是动态分配的,最大也不会暴空间. 说实话写之前感觉会很恶心,但是代码量就还好吧,有些细节需要特殊注意 ...

  5. 【2018集训队互测】【XSY3372】取石子

    题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...

  6. ASP.NET学习笔记01

    ASP.NET初级工程师的核心要求:能够实现一个基本的网站. ASP.NET初级工程师面试主要要求: 1.基础的数据结构和算法 2.C#编程语言基础 3.网站基础(HTML,CSS,Javascrip ...

  7. [CortexM0--stm32f0308]Low Power Mode

    问题描写叙述 stm32f0308正常是运行在Run mode下.这样的mode是在reset之后的默认模式.Low Power Mode.即低功耗模式.用于在IC空暇时能够考虑选择进入.使系统耗能减 ...

  8. SDUT 1225-编辑距离(串型dp)

    编辑距离 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 如果字符串的基本操作仅为:删除一个字符.插入一个字符和将一个字符改动 ...

  9. 怎样在同一台电脑使用不同的账号提交到同一个github仓库

    近期这段时间使用github.有时在公司办公,想要用git提交代码到自己的github仓库,提交是显示的作者是自己在公司的账户.而不是自己的github账户.这就相当于提交到github的代码不是自己 ...

  10. bzoj3998: [TJOI2015]弦论(SAM+dfs)

    3998: [TJOI2015]弦论 题目:传送门 题解: SAM的入门题目(很好的复习了SAM并加强Right集合的使用) 其实对于第K小的字符串直接从root开始一通DFS就好,因为son边是直接 ...