题目链接:https://www.luogu.com.cn/problem/P3387

分析
我们需要找出一条点权最大的路径。
不限制点的个数,那么对于一个环上的点被选择了,一整条环都应该被选择。
题目还允许我们重复经过某条边或者某个点
强联通缩点后,重新构图。
把强联通的标号当做顶点。如果两个点在不同的强联通内,就连一条边。
利用队列,从入度为0的点出发,把对应的权值和相加。
代码

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=1e4+10;
const int M=1e5+10;
int n,m;
int low[N],dfn[N],tot;
int st[N],top;
int fir[N],net[M],to[M],num;
int fir1[N],net1[M],to1[M],num1;
int co[N],col;
int pri[N];
int dis[N],mx[N];
int du[N];
void Index(int x,int y)
{to[++num]=y;net[num]=fir[x];fir[x]=num;
}
void Index1(int x,int y)
{to1[++num1]=y;net1[num1]=fir1[x];fir1[x]=num1;
}
void tarjan(int u)
{st[++top]=u;dfn[u]=low[u]=++tot;for(int i=fir[u]; i; i=net[i]){int v=to[i];if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(!co[v])low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]){co[u]=++col;dis[col]=pri[u];while(u!=st[top]){co[st[top]]=col;dis[col]+=pri[st[top]];--top;}--top;}
}
int tuopu()
{queue<int>q;for(int i=1; i<=col; i++)/*找度数为0的强联通分量*/if(!du[i]){q.push(i);mx[i]=dis[i];}while(!q.empty()){int u=q.front();q.pop();/*看看从入度为0的点出发,能到达哪些点,把能到达的点的权值全部加起来*/for(int i=fir1[u]; i; i=net1[i]){int v=to1[i];mx[v]=max(mx[v],mx[u]+dis[v]);du[v]--;if(!du[v])q.push(v);}}int ans1=0;for(int i=1; i<=col; i++)ans1=max(ans1,mx[i]);return ans1;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1; i<=n; i++)scanf("%d",&pri[i]);for(int i=0,x,y; i<m; i++){scanf("%d%d",&x,&y);Index(x,y);}for(int i=1; i<=n; i++)if(!dfn[i])tarjan(i);//重新建立顶点之间的关系for(int i=1; i<=n; i++)for(int j=fir[i]; j; j=net[j])if(co[i]!=co[to[j]]){Index1(co[i],co[to[j]]);/*和m条边已经没有关系了,把每一个强联通分量当成一个点*/du[co[to[j]]]++;}printf("%d\n",tuopu());return 0;
}

洛谷 P3387(缩点后+处理 )相关推荐

  1. 洛谷 P3387 缩点 题解

    题面 裸跑一遍SPFA,统计每个点的入队次数: 如果该点的入队次数>=总点数,那么该点便是一个负环上的点: 重点!!!: 1.不是"YES",是"YE5" ...

  2. (Tarjan)洛谷P3387【模板】缩点

    洛谷P3387[模板]缩点 思路: 虽然是缩点模板题,但是明显感觉比同一个题单中的其他题都难. 题目思路已经提供给你:Tarjan缩点+DAGdp.就是用Tarjan缩点,重新建图之后,边拓扑排序边建 ...

  3. 洛谷P3387 【模板】缩点 题解

    题目来源: https://www.luogu.org/problemnew/show/P3387 题目描述: 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径 ...

  4. 洛谷 P3387 【模板】缩点(scc 缩点)

    [模板]缩点 题目描述 给定一个 nnn 个点 mmm 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点 ...

  5. 洛谷P3387 【模板】缩点 (tarjan算法)

    输入: 2 2 1 1 1 2 2 1 输出: 2 解题思路:首先来说一下这个题为什么要缩点.题目中说会给定一个有向图,所以是 有可能会形成环的,又因为题目要我们求出路径上经过点的权值和最大,如果有环 ...

  6. 洛谷 P3387 【模板】缩点 tarjan 虚拟头节点和虚拟尾节点

    题目链接: https://www.luogu.org/problem/P3387 一:ac思路 参考博客: https://www.luogu.org/blog/wyz598085788/solut ...

  7. [洛谷P3387]【模板】缩点

    题目大意:给定一个$n$个点$m$条边有向图,第$i$个点有权值$w_i$,求一条路径,使路径经过的点权值之和最大,输出点权和,(多次经过一个点只算一次点权) 题解:$tarjan$缩点+$DP$ 卡 ...

  8. 强连通分量:洛谷P3387 模板:缩点

    传送门 顾名思义,模板awa #include <cstdio> #include <cstring> #include <cmath> #include < ...

  9. 洛谷 P3387 【模板】缩点

    题目 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点, ...

最新文章

  1. Python IDE专用编辑器PyCharm下载及配置安装过程(Ubuntu环境)
  2. 程序员50题(JS版本)(九)
  3. Selenium3自动化测试——10.为百度搜索设置弹窗
  4. spring中bean的细节之三种创建Bean对象的方式
  5. flask-sqlalchemy mysql_Flask SQLAlchemy连接到MySQL数据库
  6. 焦作师范高等专科学校对口计算机分数线,焦作师范高等专科学校录取分数线2018...
  7. 国内git clone报错问题解决办法
  8. Leetcode 76.最小覆盖子串
  9. 操作系统概念(Operating System Concepts Ninth Edition恐龙书)阅读
  10. Linux系统高级编程系列教程
  11. cad2020打印样式放在哪个文件夹_压箱底!这些CAD打印设置技巧只能从老师傅身上学到...
  12. WIN2000服务器安全配置(转)
  13. java期末_Java期末总结
  14. 编程珠玑——取样总结
  15. DW静态网页设计与制作 JavaScript大作业 HTML静态网页作业——海贼王主题网页设计制作6个页面(HTML+CSS)
  16. 以太坊源码分析(9)CMD实际操作分析
  17. 从神经网络到BP算法(纯理论推导)
  18. 【DFS】不撞南墙不回头—深度优先搜索算法[Deep First Search]
  19. BugkuCTF web11_网站被黑 writeup
  20. 什么是“堆”,栈,堆栈,队列,它们的区别

热门文章

  1. vscode文件飘红色波浪线
  2. Mint-UI时间组件起始时间问题
  3. 【计算机毕业设计】034学生请假系统设计与实现
  4. 电竞杨超越王思聪LOL夏季官方赛C 位出道 王校长真实水平是这样的!
  5. python 爬去拉钩测试招聘信息
  6. criterial查询(2014-05-29 03:51)续-----Example
  7. 怎么查询Mysql数据库的版本号?(2种常用的方法)
  8. 领存发布Z3系列2.5寸SATA一键自毁固态硬盘
  9. 应Oracle BEA定下每股21美元收购价
  10. 离散型均匀分布 连续型均匀分布