还是很好些的.

Code:

#include <stack>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <map>
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
namespace Tarjan{
#define maxn 1000000
#define ll long long
map<int,int>ed[maxn];
int scc,sig;
int vis[maxn];
int du[maxn];
int idx[maxn];
int pre[maxn],low[maxn];
int val[maxn];
long long value[maxn];
long long ans[maxn];
stack<int>S;
queue<int>Q;
struct graph{
int cnt;
int head[maxn],to[maxn<<1],nex[maxn<<1];
void addedge(int u,int v){
nex[++cnt] = head[u],head[u]=cnt,to[cnt] = v;
}
}G1,G2;
void tarjan(int u){
S.push(u);
vis[u] = 1;
pre[u] = low[u] = ++scc;
for(int v=G1.head[u];v;v=G1.nex[v]){
if(!vis[G1.to[v]]) {
tarjan(G1.to[v]);
low[u] = min(low[u],low[G1.to[v]]);
}
else if(vis[G1.to[v]] == 1) low[u] = min(low[u],pre[G1.to[v]]);
}
if(pre[u] == low[u]) {
++sig;
for(;;){
int a=S.top(); S.pop();
vis[a] = -1,idx[a] = sig;
value[sig] += (ll)val[a];
if(a==u) break;
}
}
}
void toposort(){
for(int i=1;i<=sig;++i)
for(int j=G2.head[i];j;j=G2.nex[j]) ++du[G2.to[j]];
for(int i=1;i<=sig;++i) if(du[i]==0) Q.push(i),ans[i] = value[i];
while(!Q.empty()){
int u=Q.front(); Q.pop();
for(int v=G2.head[u];v;v=G2.nex[v]){
ans[G2.to[v]] = max(ans[G2.to[v]],ans[u] + value[G2.to[v]]);
--du[G2.to[v]];
if(du[G2.to[v]]==0) Q.push(G2.to[v]);
}
}
long long fin=0;
for(int i=1;i<=sig;++i)
fin=max(fin,ans[i]);
printf("%lld",fin);
}
int main(){
int n,m,a,b;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&val[i]);
for(int i=1;i<=m;++i) {
scanf("%d%d",&a,&b);
G1.addedge(a,b);
}
for(int i=1;i<=n;++i) if(!vis[i]) tarjan(i);
for(int i=1;i<=n;++i)
for(int v=G1.head[i];v;v=G1.nex[v])
if(idx[i]!=idx[G1.to[v]] && !ed[idx[i]][idx[G1.to[v]]])
G2.addedge(idx[i],idx[G1.to[v]]),ed[idx[i]][idx[G1.to[v]]]=1;
toposort();
return 0;
}
};
int main(){
Tarjan::main();
return 0;
}

  

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. Final 用法

    可修饰:类及类的成员.成员变量.局部变量,不能修饰构造方法 final修饰的类不能被继承但可以继承其他的类 final修饰的类不能被重写和继承,子类修改的方法可以加继承 final修饰的局部变量和成员 ...

  2. Elasticsearch学习(一)————简单命令

    Elasticsearch一.简介**Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索.结构化检索和分析,并能将这三者结合起来.Elasticsearch 基于 Lucene ...

  3. Project Euler 31 1000-digit Fibonacci number( DP )

    题意:在无限硬币的情况下能组成200的方案数有多少个 思路:DP,设数组 dp[ n ] [ k ] 代表前 n 种硬币能够组成 k 元的方案数,那么就能得到 dp [ n ] [ k ] = dp ...

  4. linux一些简单的操作命令

    命令ifconfig -a——查询自己ip地址命令top——查看cpu.内存命令uname——查看系统版本命令pwd——查看当前路径命令ln——建立连接 ln source_path target_p ...

  5. 百度url 参数详解全

    百度url解析Joe.Smith整理大全 百度url解析Joe.Smith整理大全...1 本文链接:http://blog.csdn.net/qq_26816591/article/details/ ...

  6. 02springMVC理解DispatcherServlet

    DispatcherServlet的作用 DispatcherServlet在Web.xml中的配置 上下文关系 DispatcherServlet初始化顺序 DispatcherServlet中使用 ...

  7. jdk环境变量设置理解

    1.系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0) 2.系统变量→寻找 Path 变量→编辑 在变量值最后输入 %JAVA_HOM ...

  8. 小米2S电池电量用尽充电无法开机解决方法

    背景:        昨晚睡觉前关机,记得电量还有百分之七八十,但早上起床后,指示灯一直红灯闪烁.按开机键和其它键都没反应! ! 解决方法:         扣下电池,用万能充冲电,略微多冲一会,由于 ...

  9. hdoj 5092 Seam Carving 【树塔DP变形 + 路径输出】 【简单题】

    Seam Carving Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  10. do while 循环和while循环的差别

    do while 循环和while循环的差别 1.do while循环是先运行循环体,然后推断循环条件,假设为真,则运行下一步循环,否则终止循环.    while循环是先推断循环条件,假设条件为真则 ...