博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷3387:【模板】缩点——题解
阅读量:6689 次
发布时间:2019-06-25

本文共 1491 字,大约阅读时间需要 4 分钟。

给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。

允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。

有环我们很不好判断,但是显然在一个强连通分量里面的点我们都可以到达。

所以缩起来之后就是一个DAG,之后随便你怎么算都行(bfs/dfs)

(我觉得并不算是dp emmm)

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int N=1e4+5;const int M=1e5+5;inline int read(){ int x=0,w=1;char ch=0; while(ch<'0'||ch>'9'){ if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*w;}struct node{ int w,to,nxt;}e[2][M];int cnt,h[2][N];inline void add(int u,int v,int k){ e[k][++cnt].to=v;e[k][cnt].nxt=h[k][u];h[k][u]=cnt;}int dfn[N],low[N],val[N],to[N],sum[N],f[N],indeg[N],t,l;stack
q;queue
p;bool inq[N],vis[N];void tarjan(int u){ int v; dfn[u]=low[u]=++t; q.push(u);inq[u]=1; for(int i=h[0][u];i;i=e[0][i].nxt){ v=e[0][i].to; 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]){ l++; do{ v=q.top(); q.pop(); inq[v]=0; to[v]=l; sum[l]+=val[v]; }while(v!=u); }}void bfs(int u){ vis[u]=1;f[u]=sum[u]; p.push(u); while(!p.empty()){ u=p.front();p.pop();vis[u]=0; for(int i=h[1][u];i;i=e[1][i].nxt){ int v=e[1][i].to; if(f[v]

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8696626.html

你可能感兴趣的文章
回顾2014,展望2015
查看>>
BIOS基础知识(下)
查看>>
Iterator 和 Iterable 区别和联系
查看>>
经典SQL语句大全
查看>>
测试LCD1602的显示,显示时间,提示语
查看>>
PHP常见的加密技术
查看>>
Asp.net读取AD域信息的方法(一)
查看>>
两道题学习动态规划
查看>>
mysql实战31 | 误删数据后除了跑路,还能怎么办?
查看>>
ASP.NET MVC Razor
查看>>
python:使用OO和工厂模式解决问题
查看>>
C++学习-2
查看>>
GAITC 2019全球人工智能技术大会(南京)
查看>>
使用gradle生成protobuf
查看>>
transition transform animate的使用
查看>>
【翻译】Ext JS最新技巧——2014-5-12
查看>>
全局临时表
查看>>
谈谈加载(Loading)的那点事
查看>>
微信公众平台开发(108) 微信摇一摇
查看>>
linux环境中如何删除文件的前n行?
查看>>