luogu P3387 【模板】缩点_拓扑排序
还是很好些的.
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 【模板】缩点_拓扑排序的更多相关文章
- b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子图
b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子 题意:n*m个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...
- BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心
BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...
- [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)
[LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...
- 【模拟7.16】通讯(tarjan缩点加拓扑排序)
这题确实水,纯板子,考试意外出错,只拿了暴力分QAQ tarjan缩点加上拓扑排序,注意这里求最短路径时不能用最小生成树 因为是单向边,不然就可能不是一个联通图了.... 1 #include< ...
- 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)
Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...
- P3387缩点(tarjan+拓扑排序+线性dp)
题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...
- 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 787 Solved: 318[Submit][Stat ...
- NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset
描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...
- [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)
题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...
随机推荐
- JS 输入年份,再输入月份,弹出这个月有多少天?
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 怎么让composer加速(转)
composer 在install的时候会做这几个事情: 去packagist.org中寻找对应需要的包的版本信息和下载地址 循环下载对应的包 解压安装对应的包 我们平时使用composer慢就可能在 ...
- Node笔记(1)
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. 进程 1.process.argv 用于获取当前进程信息 0--node.exe的目录1--js文件的目录2 ...
- POJ 2395 Out of Hay( 最小生成树 )
链接:传送门 题意:求最小生成树中的权值最大边 /************************************************************************* & ...
- 利用Tensorflow训练自定义数据
很多正在入门或刚入门TensorFlow机器学习的同学希望能够通过自己指定图片源对模型进行训练,然后识别和分类自己指定的图片.但是,在TensorFlow官方入门教程中,并无明确给出如何把自定义数据输 ...
- Java并发之线程间的同步协作与通信协作
1,Monitor监视器与syncrhoized实现原理 1.1:Monitor Monitor是一个同步工具,相当于操作系统中的互斥量(mutex),即值为1的信号量. 它内置与每一个Object对 ...
- C/C++ 获取文件夹下的所有文件列表
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51009608 提供一段C/C++代码示 ...
- TensorFlow 版本问题
TensorFlow各个版本均可以在GitHub上下载,之前下载配置的是0.5.0版本,运行的时候,出现很多问题,什么模块缺失attribute,函数参数问题等,修改起来让人抓狂,后来索性下载使用0. ...
- POJ 3737
第一道三分题,有模板 #define eps 10e-6 double cal(){}//计算题目所需要的值 while(l+eps<r) { m1=l+(r-l)/3; m2=r-(r-l)/ ...
- Android开发之——编码规范
1. 前言 这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范.该文档仅供参考,只要形成一个统一的风格,见量知其意就可. 2. 源文件基础 2.1 ...