【模板】缩点 洛谷p3387
来源:互联网 发布:淘宝外贸的衣服能买吗 编辑:程序博客网 时间:2024/06/06 01:00
题目背景
缩点+DP
题目描述
给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。
允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。
输入输出格式
输入格式:第一行,n,m
第二行,n个整数,依次代表点权
第三至m+2行,每行两个整数u,v,表示u->v有一条有向边
输出格式:共一行,最大的点权之和。
输入输出样例
2 21 11 22 1
2
说明
n<=10^4,m<=10^5,|点权|<=1000算法:Tarjan缩点+DAGdp
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#define f(i,l,r) for(i=(l);i<=(r);i++)
using namespace std;
const int MAXN=10005,MAXM=100005;
struct Edge{
int v,next;
}e[MAXM<<1];
int n,m,head[MAXN<<1],tot,w[MAXN<<1],group[MAXN],ne;
int Dfn[MAXN],Low[MAXN],TIMES,inq[MAXN];
stack<int> q;
int ans,vis[MAXN<<1],f[MAXN<<1];
inline void add(int u,int v)
{
e[tot].v=v;
e[tot].next=head[u];
head[u]=tot++;
}
inline void Tarjan(int u)
{
int i,node;
Dfn[u]=Low[u]=++TIMES;
q.push(u);
inq[u]=1;
for(i=head[u];~i;i=e[i].next){
int v=e[i].v;
if(!Dfn[v]){
Tarjan(v);
Low[u]=min(Low[u],Low[v]);
}
else if(inq[v]) Low[u]=min(Low[u],Dfn[v]);
}
if(Dfn[u]==Low[u]){
ne++;
do{
node=q.top();q.pop();
inq[node]=0;
group[node]=ne;
w[ne]+=w[node];
}while(node!=u);
}
}
inline int dp(int u)
{
int i;
if(vis[u]) return f[u];
for(i=head[u];~i;i=e[i].next){
int v=e[i].v;
f[u]=max(f[u],dp(v));
}
f[u]+=w[u];
vis[u]=1;
return f[u];
}
int main()
{
ios::sync_with_stdio(false);
memset(head,-1,sizeof(head));
int i,j,u,v;
cin>>n>>m;
ne=n;
f(i,1,n){
cin>>w[i];
}
f(i,1,m){
cin>>u>>v;
add(u,v);
}
f(i,1,n){
if(Dfn[i]) continue;
Tarjan(i);
}
f(i,1,n){
for(j=head[i];~j;j=e[j].next){
int v=e[j].v;
if(group[i]==group[v]) continue;
add(group[i],group[v]);
}
}
f(i,n+1,ne){
ans=max(ans,dp(i));
}
cout<<ans<<endl;
return 0;
}
- 【模板】缩点 洛谷p3387
- 洛谷 P3387 【模板】缩点
- Tarjan 缩点模板(洛谷P3387)
- Tarjan缩点模板(洛谷P3387)
- 洛谷p3387 拓扑+tarjan缩点
- 强连通分量与缩点(Tarjan算法)(洛谷P3387)
- Tarjan缩点模板
- luoguP3387 【模板】缩点
- 高效率 kosaraju+缩点 模板
- poj 2186 DAG+缩点+tarjan模板 (模板待消化
- 模板整理: 图论---tarjan缩点/桥/割点
- 强连通分量缩点的模板
- 【hh大神的】Tarjan + 缩点 模板
- tarjan缩点模板 poj 2186
- 双联通分量缩点模板
- 强连通分量缩点模板
- tarjan算法缩点构图(模板)
- 模板:强连通分量和缩点
- hdu 6108 小C的倍数问题【一个数的因子个数】
- C#中this的用法
- 读写CFILE 与UpdateData
- Hibernate之HQL的基本用法
- 华为2017校招第二题删除重复的数,得到最大值。
- 【模板】缩点 洛谷p3387
- 2017.8.23考试
- php 微信开发回复消息
- 【清华集训2017模拟】Create
- Codeforces 785B Anton and Classes(贪心)
- bootstrap angularjs 实现jsp页面购物车
- 剑指Offer—28—数组中出现次数超过一半的数字
- 润乾报表如何配置/部署多个lmd文件
- Leetcode 122. Best Time to Buy and Sell Stock II