洛谷p3387 拓扑+tarjan缩点
来源:互联网 发布:python中执行shell脚本 编辑:程序博客网 时间:2024/06/10 20:07
题目背景
缩点+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缩点+DAGdp
Q
注意:
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;}
阅读全文
1 0
- 洛谷p3387 拓扑+tarjan缩点
- Tarjan 缩点模板(洛谷P3387)
- Tarjan缩点模板(洛谷P3387)
- 【模板】缩点 洛谷p3387
- 洛谷 P3387 【模板】缩点
- 强连通分量与缩点(Tarjan算法)(洛谷P3387)
- poj 2762 tarjan+缩点+拓扑排序
- UOJGraph(tarjan缩点+拓扑)
- poj 3160【tarjan缩点+拓扑排序+DP】
- [Tarjan缩点 拓扑序DP] SRM 499 1000pts
- POJ 3648 Wedding (Tarjan + 缩点 + 拓扑排序)
- hdu 6165 FFF at Valentine(tarjan缩点+拓扑排序)
- vector表示十字链表+Tarjan+缩点+拓扑排序 详解 poj 2762
- [BZOJ 1093 && YZOI1172] Tarjan缩点+拓扑DP 最大半连通子图
- BZOJ 1924 [Sdoi2010]所驼门王的宝藏 tarjan缩点+拓扑DP
- BZOJ 1512 [POI2006]Pro-Professor Szu Tarjan缩点+拓扑DP
- Poj 3648 Wedding【2-Sat--------Tarjan强连通+缩点染色+拓扑排序】
- 自行车比赛+纪中1238+tarjan缩点+拓扑排序+玄学优化
- linux tar 打包和 gzip压缩
- ionicframework开发框架之弹窗$ionicPopup
- 由星座判断引发我对vue.js的思考问题的模式的基本启示
- MySQL之修改数据表操作
- Codeforces Round #431 (Div. 2) 848A From Y to Y(思维)
- 洛谷p3387 拓扑+tarjan缩点
- 案例分享:如何通过JVM crash 的日志和core dump定位和分析Instrument引起的JVM crash
- 开发者需要的 9 款代码比较工具
- 测试
- 动态规划-试题(4)-转移罪犯
- 二分查找及插值查找
- C#基础-045 练习题
- SQL Server 触发器
- 自定义view继承Button