洛谷——P3387 【模板】缩点
P3387 【模板】缩点
题目背景
缩点+DP
题目描述
给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。
允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。
输入输出格式
输入格式:
第一行,n,m
第二行,n个整数,依次代表点权
第三至m+2行,每行两个整数u,v,表示u->v有一条有向边
输出格式:
共一行,最大的点权之和。
输入输出样例
说明
n<=10^4,m<=10^5,|点权|<=1000 算法:Tarjan缩点+DAGdp
啊啊啊啊啊,zz啊,把一个j写成了i,然后调了一晚上、、、
tarjan缩点+spfa求最长路
- #include<queue>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define N 100010
- using namespace std;
- queue<int>q;
- bool vis[N];
- int n,m,x,y,tot,tim,top,sum,ans,a[N],v[N],s[N];
- int dis[N],dfn[N],low[N],head[N],head1[N],stack[N],belong[N];
- int read()
- {
- ,f=; char ch=getchar();
- ;ch=getchar();}
- +ch-',ch=getchar();
- return x*f;
- }
- struct Edge
- {
- int to,next,from;
- }edge[N],edge1[N];
- int add(int x,int y)
- {
- tot++;
- edge[tot].to=y;
- edge[tot].next=head[x];
- head[x]=tot;
- }
- int add1(int x,int y)
- {
- tot++;
- edge1[tot].to=y;
- edge1[tot].next=head1[x];
- head1[x]=tot;
- }
- int spfa(int s)
- {
- ;i<=n;i++) dis[i]=-,vis[i]=false;
- dis[s]=v[s],vis[s]=true;
- q.push(s),ans=max(ans,v[s]);
- while(!q.empty())
- {
- x=q.front(); q.pop(),vis[x]=false;
- for(int i=head1[x];i;i=edge1[i].next)
- {
- int t=edge1[i].to;
- if(dis[t]>dis[x]+v[t]) continue;
- dis[t]=dis[x]+v[t];
- ans=max(ans,dis[t]);
- if(vis[t]) continue;
- vis[t]=true,q.push(t);
- }
- }
- }
- int tarjan(int x)
- {
- dfn[x]=low[x]=++tim;
- stack[++top]=x,vis[x]=true;
- for(int i=head[x];i;i=edge[i].next)
- {
- int t=edge[i].to;
- if(vis[t]) low[x]=min(low[x],dfn[t]);
- else if(!dfn[t]) tarjan(t),low[x]=min(low[x],low[t]);
- }
- if(low[x]==dfn[x])
- {
- sum++;belong[x]=sum;v[sum]+=a[x];
- for(;stack[top]!=x;top--)
- {
- v[sum]+=a[stack[top]];
- belong[stack[top]]=sum;
- vis[stack[top]]=false;
- }
- vis[x]=false,top--;
- }
- }
- int shink_point()
- {
- tot=;int t;
- ;i<=n;i++)
- for(int j=head[i];j;j=edge[j].next)
- {
- t=edge[j].to;
- if(belong[i]!=belong[t])
- add1(belong[i],belong[t]);
- }
- }
- int main()
- {
- n=read(),m=read();
- ;i<=n;i++) a[i]=read();
- ;i<=m;i++)
- x=read(),y=read(),add(x,y);
- ;i<=n;i++)
- if(!dfn[i]) tarjan(i);
- shink_point();
- ;i<=sum;i++)
- spfa(i);
- printf("%d",ans);
- }
洛谷——P3387 【模板】缩点的更多相关文章
- 洛谷P3387 【模板】缩点 题解
背景 今天\(loj\)挂了,于是就有了闲情雅致来刷\(luogu\) 题面 洛谷P3387 [模板]缩点传送门 题意 给定一个\(n\)个点\(m\)条边有向图,每个点有一个权值,求一条路径,使路径 ...
- 洛谷 P3387 【模板】缩点 DAGdp学习记
我们以洛谷P3387 [模板]缩点 来学习DAGdp 1.这道题的流程 //伪代码 for i->n if(i未被遍历) tarjan(i) 缩点() DAGdp() 完成 首先tarjan这部 ...
- tarjan缩点练习 洛谷P3387 【模板】缩点+poj 2186 Popular Cows
缩点练习 洛谷 P3387 [模板]缩点 缩点 解题思路: 都说是模板了...先缩点把有环图转换成DAG 然后拓扑排序即可 #include <bits/stdc++.h> using n ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷 P2656 (缩点 + DAG图上DP)
### 洛谷 P2656 题目链接 ### 题目大意: 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇.小胖 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
随机推荐
- 9、python中的控制流
学习完python的基础与数据后,我们就可以编写一些简单的命令了.但这时我们发现,目前位置写出来的程序都是自上而下顺序地执行的.要想程序改变这种自上而下的流程多一点变化,我们就要学习三种程序中的语句. ...
- optparser 模块 提取IP,端口,用户名,密码参数模板
import optparse #class FtpClient(object): #自定义类可以自己修改 '''ftp客户端''' #def __init__(self): parser = opt ...
- Gpfixup
Updated: April 17, 2012 Applies To: Windows Server 2003, Windows Vista, Windows Server 2008, Windows ...
- 3、CSS基础 part-1
1.给body设置颜色 <html> <body text="red"> <p> hello world</p> <p> ...
- Github问题An error occurred trying to download
Github for windows安装过程出现了这样的问题An error occurred trying to download 'http://github-windows.s3.amazona ...
- Windows下MySQL8.0.11.0安装教程
1.mysql下载地址:https://dev.mysql.com/downloads/installer/ 2.下载安装MySQL 8.0.11.0 https://cdn.mysql.com//D ...
- 微信小程序--问题汇总及详解之form表单
附上微信小程序开发文档链接:https://mp.weixin.qq.com/debug/wxadoc/dev/framework/MINA.html form表单: 当点击 <form/> ...
- File IO(NIO.2):什么是路径?
简介 文件系统以某种形式的媒体(通常为一个或多个硬盘驱动器)存储和组织文件,使得它们可以容易地被检索.目前使用的大多数文件系统将文件存储在树形(或分层)结构中.在树的顶部是一个(或多个)根节点.在根节 ...
- nyoj 题目14 会场安排问题
会场安排问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工 ...
- [SDOI2010][bzoj1927] 星际竞速 [最小路径覆盖+费用流]
题面 传送门 思路 仔细观察题目要求的东西,发现就是求一个最小路径覆盖,只不过可以跳跃(就是那个鬼畜的超级跳跃) 那么就直接上最小路径覆盖模版 对每个点,拆成两个点$X_i$和$Y_i$,建立超级源超 ...