洛谷p3387 拓扑+tarjan缩点
2017-09-02 08:46
344 查看
题目背景
缩点+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缩点+DAGdpQ
注意:1.两个建树函数区分;
2.缩完点后再统计入度、出度;
3.初始化;
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<stack> #include<queue> using namespace std; const int MAXN=1e5*2+10; int n,m,fst[MAXN],nxt[MAXN],low[MAXN],scc[MAXN],dfn[MAXN],dis[MAXN],sz[MAXN],dp[MAXN]; int ru[MAXN],ch[MAXN]; int t,tim,tot,cnt=0,ans=-1; struct hh { int from,to; }ma[MAXN],ss[MAXN]; stack<int>s; queue<int>q; void add(int f,int t) { tot++; ma[tot]=(hh){f,t}; nxt[tot]=fst[f]; fst[f]=tot; return; } void build(int f,int t) { tot++; ss[tot]=(hh){f,t}; nxt[tot]=fst[f]; fst[f]=tot; return; } void tarjan(int x) { low[x]=dfn[x]=++tim; s.push(x); for(int i=fst[x];i;i=nxt[i]) { int v=ma[i].to; if(!dfn[v]) tarjan(v),low[x]=min(low[x],low[v]); else if(!scc[v]) low[x]=min(low[x],dfn[v]); } if(dfn[x]==low[x]) { cnt++; while(true) { int u=s.top(); s.pop(); scc[u]=cnt; sz[cnt]+=dis[u]; if(u==x) break; } } return; } void bfs() { while(!q.empty()) { int x=q.front(); q.pop(); for(int i=fst[x];i;i=nxt[i]) { int v=ss[i].to; ru[v]--; dp[v]=max(dp[v],dp[x]+sz[v]); if(!ru[v]) q.push(v); } } for(int i=1;i<=n;i++) if(!ch[i]) ans=max(dp[i],ans); return; } void solve() { int x,y; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&dis[i]); for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),add(x,y); for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i); memset(fst,0,sizeof(fst)); memset(nxt,0,sizeof(nxt)); tot=0; for(int i=1;i<=m;i++) { int f=ma[i].from,t=ma[i].to; if(scc[f]!=scc[t]) { build(scc[f],scc[t]); ru[scc[t]]++; ch[scc[f]]++; } } for(int i=1;i<=cnt;i++) if(!ru[i]) q.push(i),dp[i]=sz[i]; bfs(); cout<<ans; } int main() { solve(); return 0; }
相关文章推荐
- Tarjan 缩点模板(洛谷P3387)
- BZOJ1565 [NOI2009]植物大战僵尸 【最大权闭合子图 + tarjan缩点(或拓扑)】
- 洛谷P2341 受欢迎的牛——Tarjan+缩点模板
- Tarjan缩点+LCA【洛谷P2416】 泡芙
- HDU 6165 FFF at Valentine (tarjan缩点+拓扑判任意两点联通)
- 【模板】缩点 洛谷p3387
- tarjan缩点以及链式前向星的基本+应用(洛谷1262 间谍网络)
- UOJGraph(tarjan缩点+拓扑)
- Tarjan 缩点(P3387)
- 洛谷1262间谍网络(tarjan缩点)
- Tarjan+topsort(DP)【P3387】 [模板]缩点
- 洛谷 P3387 【模板】缩点
- [BZOJ 1093 && YZOI1172] Tarjan缩点+拓扑DP 最大半连通子图
- 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码
- 洛谷 P3387 【模板】缩点
- 洛谷1262 间谍网络 tarjan缩点
- BZOJ 1512 [POI2006]Pro-Professor Szu Tarjan缩点+拓扑DP
- BZOJ 1924 [Sdoi2010]所驼门王的宝藏 tarjan缩点+拓扑DP
- 【判定弱连通】==【tarjan求scc + 缩点+拓扑】
- BZOJ1565 [NOI2009]植物大战僵尸 【最大权闭合子图 + tarjan缩点(或拓扑)】