传送门

有向图。。

代码中有两种方法,拓扑排序和记忆化搜索

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define re register
using namespace std ;
const int maxn = 1e5 + 4 ; inline int read () {
int f = 1 , x = 0 ;
char ch = getchar () ;
while(ch > '9' || ch < '0') {if(ch == '-') f = -1 ; ch = getchar () ;}
while(ch >= '0' && ch <= '9') {x = (x << 1) +(x << 3) + ch - '0' ; ch = getchar () ;}
return x * f;
} int n , m , a[maxn] , u , v , ans ;
int head[maxn] , tot , head2[maxn] , tot2 ; struct Edge {
int from , to , next ;
}edge[maxn << 1] , edge2[maxn] ; inline void add(int u , int v) {
edge[++tot].from = u ;
edge[tot].to = v ;
edge[tot].next =head[u] ;
head[u] = tot ;
} inline void add2(int u , int v) {
edge2[++tot2].from = u ;
edge2[tot2].to = v;
edge2[tot2].next = head2[u];
head2[u] = tot2;
} int stack[maxn] , belong[maxn] , top , cnt , num[maxn] ;
int low[maxn] , dfn[maxn] , ind , dis[maxn] ;
bool ins[maxn] ; inline void tarjan(int x) {
dfn[x] = low[x] = ++ind;
stack[++top] = x ;
ins[x] = true ;
for(re int i = head[x] ; i; i = edge[i].next) {
int v = edge[i].to ;
if(!dfn[v]) {
tarjan(v) ;
low[x] = min(low[x] , low[v]);
}
if(ins[v]) {
low[x] = min(low[x] , dfn[v]);
}
}
int k = 0;
if(dfn[x] == low[x]) {
++cnt;
do{
k = stack[top];
top--;
ins[k] = false;
num[cnt]++;
dis[cnt] += a[k];
belong[k] = cnt;
}while (k != x);
}
} queue<int> q;
int dis2[maxn] , in[maxn] ; inline int topo() {
for(re int i = 1 ; i <= cnt ; ++ i)
if(!in[i]) {
q.push(i);
dis2[i] = dis[i];
}
while(!q.empty()) {
int cur = q.front();
q.pop() ;
for(re int i = head2[cur] ; i ; i = edge2[i].next) {
int v = edge2[i].to ;
dis2[v] = max(dis2[v] , dis2[cur] + dis[v]) ;
in[edge2[i].to]-- ;
if(!in[edge2[i].to])
q.push(edge2[i].to) ;
}
}
for(re int i = 1 ; i <= n ; ++ i)
ans = max(ans , dis2[i]) ;
return ans;
} int main () {
n = read () ; m =read() ;
for(re int i = 1 ; i <= n ; ++ i)
a[i] = read () ;
for(re int i = 1 ; i <= m ; ++ i) {
u = read () ; v = read () ;
add(u , v) ;
}
for(re int i = 1 ; i <= n ; ++ i)
if(!dfn[i]) tarjan(i) ;
for(re int i = 1 ; i <= tot ; ++ i) {
if(belong[edge[i].from] != belong[edge[i].to]) {
add2(belong[edge[i].from] , belong[edge[i].to]) ;
in[belong[edge[i].to]]++ ;
}
}
printf("%d\n" , topo()) ;
return 0 ;
}

洛谷P3387缩点的更多相关文章

  1. 洛谷P3387 缩点模板

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

  2. 洛谷P3387 【模板】缩点 题解

    背景 今天\(loj\)挂了,于是就有了闲情雅致来刷\(luogu\) 题面 洛谷P3387 [模板]缩点传送门 题意 给定一个\(n\)个点\(m\)条边有向图,每个点有一个权值,求一条路径,使路径 ...

  3. 洛谷 P3387 【模板】缩点 DAGdp学习记

    我们以洛谷P3387 [模板]缩点 来学习DAGdp 1.这道题的流程 //伪代码 for i->n if(i未被遍历) tarjan(i) 缩点() DAGdp() 完成 首先tarjan这部 ...

  4. tarjan缩点练习 洛谷P3387 【模板】缩点+poj 2186 Popular Cows

    缩点练习 洛谷 P3387 [模板]缩点 缩点 解题思路: 都说是模板了...先缩点把有环图转换成DAG 然后拓扑排序即可 #include <bits/stdc++.h> using n ...

  5. 洛谷——P3387 【模板】缩点

    P3387 [模板]缩点 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点, ...

  6. 【模板】缩点(Tarjan算法)/洛谷P3387

    题目链接 https://www.luogu.com.cn/problem/P3387 题目大意 给定一个 \(n\) 个点 \(m\) 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之 ...

  7. 洛谷P3387 【模板】缩点

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

  8. 洛谷 P3387 【模板】缩点

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

  9. 洛谷 P3387 题解

    题面 裸跑一遍SPFA,统计每个点的入队次数: 如果该点的入队次数>=总点数,那么该点便是一个负环上的点: 重点!!!: 1.不是“YES”,是“YE5”: 2.不是“NO”,是“N0”:(是零 ...

随机推荐

  1. oracle的学习笔记

    Oracle的介绍 1. Oracle的创始人----拉里•埃里森 2. oracle的安装 [连接Oracle步骤](](https://img2018.cnblogs.com/blog/12245 ...

  2. android 7.0 新特性 和对开发者的影响

    android 7.0新特性 - jiabailong的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/jiabailong/article/details/5241 ...

  3. [转]Asp.Net MVC使用HtmlHelper渲染,并传递FormCollection参数的陷阱

    http://www.cnblogs.com/errorif/archive/2012/02/13/2349902.html 在Asp.Net MVC 1.0编程中,我们经常遇见这样的场景,在新建一个 ...

  4. 特征降维之PCA

    目录 PCA思想 问题形式化表述 PCA之协方差矩阵 协方差定义 矩阵-特征值 PCA运算步骤 PCA理论解释 最大方差理论 性质 参数k的选取 数据重建 主观理解 应用 代码示例 PCA思想 PCA ...

  5. kernel-init-bash

    https://www.kernel.org/doc/Documentation/kernel-parameters.txthttp://unix.stackexchange.com/question ...

  6. 【Asp.net入门16】第一个ASP.NET 应用程序-总结

    本章创建了一个新的ASP.NET项目,并用它创建了一个简单的数据输入应用程序,向你初步介绍 了ASP.NET平台.本章省略了许多重要的功能,只为向你说明ASP.NET应用程序所执行的核心操作—— 使用 ...

  7. java基础-Integer类常用方法介绍

    java基础-Integer类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需 ...

  8. 科学计算三维可视化---Mayavi入门(Mayavi管线)

    一:Mayavi管线 mlab.show_pipeline() #显示管线层级,来打开管线对话框 (一)管线中的对象scene Mayavi Scene:处于树的最顶层的对象,他表示场景,配置界面中可 ...

  9. call 大佬 三分姿势

    为什么注释掉的三分方式不能过 @大佬 题目来源:http://hihocoder.com/problemset/problem/1142?sid=1003381 貌似不是eps的问题 #include ...

  10. 京东全链路压测军演系统(ForceBot)架构解密

    摘要:全链路压测是应对电商大促容量规划最有效的手段,如何有效进行容量规划是其中的架构关键问题.京东在全链路压测方面做过多年尝试,本文转载京东商城基础平台技术专家文章,介绍其最新的自动化压测 Force ...