洛谷 P3387 【模板】缩点
2018-02-26 23:21
399 查看
P3387 【模板】缩点
题目链接题目背景
缩点+DP
题目描述
给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。
允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。
输入输出格式
输入格式:
第一行,n,m
第二行,n个整数,依次代表点权
第三至m+2行,每行两个整数u,v,表示u->v有一条有向边
输出格式:
共一行,最大的点权之和。
输入输出样例
输入样例#1:
2 2
1 1
1 2
2 1
输出样例#1:
2
说明
n<=10^4,m<=10^5,点权<=1000
算法:Tarjan缩点+DAG dp
tarjan算法详解
完整代码:
#include<bits/stdc++.h> using namespace std; const int N = 10010, M = 100010; struct node { int to, next; }g[M], s[M]; int last , gl; int last2 , sl; int u[M], v[M], w[M]; int n, m; int dfn , cnt, low ; stack<int> z; void add(int x, int y) { g[++gl] = (node){y, last[x]}; last[x] = gl; } void add2(int x, int y) { s[++sl] = (node){y, last2[x]}; last2[x] = sl; } int ans, color , sum ; bool vis ; void tarjan(int x)//缩点 { low[x] = dfn[x] = ++cnt; vis[x] = 1; z.push(x); for(int i = last[x]; i; i = g[i].next) { int to = g[i].to; if(!dfn[to]) { tarjan(to); low[x] = min(low[x], low[to]); } else if(vis[to]) low[x] = min(low[x], low[to]); } if(low[x] == dfn[x]) { ans++; while(z.top()!=x) { color[z.top()] = ans; sum[ans] += w[z.top()]; vis[z.top()] = 0; z.pop(); } color[z.top()] = ans; sum[ans] += w[z.top()]; vis[z.top()] = 0; z.pop(); } return ; } void work() { for(int i = 1; i <= n; i++) if(!dfn[i]) tarjan(i); return ; } int f ; void dfs(int x, int fa) { for(int j = last2[x]; j; j = s[j].next) { int to = s[j].to; if(to == fa) continue; if(f[to] < f[x] + sum[to]) f[to] = f[x]+sum[to], dfs(to, x); } return ; } int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) scanf("%d", &w[i]); for(int i = 1; i <= m; i++) { scanf("%d%d", &u[i], &v[i]); add(u[i], v[i]); } work(); for(int i = 1; i <= m; i++) if(color[u[i]]!=color[v[i]]) add2(color[u[i]], color[v[i]]); for(int i = 1; i <= n; i++) f[color[i]] = sum[color[i]]; for(int i = 1; i <= n; i++)//记忆化搜索 dfs(color[i], 0); int MAX = -2147483647; for(int i = 1; i <= n; i++) MAX = max(MAX, f[color[i]]); printf("%d\n", MAX); return 0; }
相关文章推荐
- 【模板】缩点 洛谷p3387
- Tarjan 缩点模板(洛谷P3387)
- 洛谷 P3387 【模板】缩点
- Tarjan+topsort(DP)【P3387】 [模板]缩点
- 洛谷p3387 拓扑+tarjan缩点
- 强连通分量模板+DAGdp 洛谷P3387
- P3387 【模板】缩点
- 洛谷P2341 受欢迎的牛——Tarjan+缩点模板
- P3387 【模板】缩点
- 图论算法-Tarjan模板 【缩点;割顶;双连通分量】
- 洛谷4525 & 4526:【模板】自适应辛普森法——题解
- 洛谷.4238.[模板]多项式求逆(NTT)
- 【洛谷P3796】【模板】AC自动机(加强版)
- 并查集(模板) 洛谷3367
- 洛谷P3375 [模板]KMP字符串匹配
- 洛谷 模板 树状数组
- 洛谷 P 3379 【模板】最近公共祖先(LCA)
- 洛谷—— P3385 【模板】负环
- 洛谷 P2580 于是他错误的点名开始了(模板)
- 【模板】最小费用最大流(增广路)(模板题:洛谷P3381)