Luogu3387 缩点 【tarjan】【DP】
Luogu3387 缩点
题目背景
缩点+DP
题目描述
给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。
允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。
输入格式:
第一行,n,m
第二行,n个整数,依次代表点权
第三至m+2行,每行两个整数u,v,表示u->v有一条有向边
输出格式:
共一行,最大的点权之和。
输入样例:
2 2
1 1
1 2
2 1
输出样例:
2
说明
n<=10^4,m<=10^5,点权<=1000
挺板子的一道题,敲它主要是因为最近爱上了封装科技
虽然题面没有说,不过这道题的数据好像没有涉及到负数,不然还有点麻烦
直接把原图tarjan缩点然后DAG上面DP就好了
小技巧:如果不想考虑缩点之后两个点之间有多条边的情况,直接记忆化搜索就好了
//yangkai
#include<bits/stdc++.h>
using namespace std;
#define N 100010
int m,ans=0,ru[N],f[N];
struct Edge{int u,v,next;};
struct G{
Edge E[N];
int head[N],val[N],tot,siz;//siz:节点个数
G(){
tot=0;
memset(head,0,sizeof(head));
memset(val,0,sizeof(val));
}
void add(int u,int v){
E[++tot]=(Edge){u,v,head[u]};
head[u]=tot;
}
}g1,g2;
struct Tarjan{
G g;
int dfn[N],low[N],belong[N],index,cnt;
bool vis[N];
stack<int> s;
Tarjan(){index=cnt=0;}
void tarjan(int u){
vis[u]=1;s.push(u);
dfn[u]=low[u]=++index;
for(int i=g.head[u];i;i=g.E[i].next){
int v=g.E[i].v;
if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
else if(vis[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int v;cnt++;
do{
v=s.top();s.pop();
belong[v]=cnt;
vis[v]=0;
}while(v!=u);
}
}
void tarjan(){
for(int i=1;i<=g.siz;i++)
if(!dfn[i])tarjan(i);
}
}tar;
int dfs(int u){//记忆化搜索部分
if(f[u])return f[u];
for(int i=g2.head[u];i;i=g2.E[i].next){
int v=g2.E[i].v;
f[u]=max(f[u],dfs(v));
}
return f[u]+=g2.val[u];
}
int main(){
scanf("%d%d",&g1.siz,&m);
for(int i=1;i<=g1.siz;i++)scanf("%d",&g1.val[i]);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
g1.add(u,v);
}
tar.g=g1;
tar.tarjan();
for(int i=1;i<=g1.siz;i++)
g2.siz=tar.cnt;
for(int i=1;i<=g1.siz;i++)g2.val[tar.belong[i]]+=g1.val[i];
for(int i=1;i<=m;i++)if(tar.belong[g1.E[i].u]!=tar.belong[g1.E[i].v])
g2.add(tar.belong[g1.E[i].u],tar.belong[g1.E[i].v]),ru[tar.belong[g1.E[i].v]]=1;
for(int i=1;i<=g2.siz;i++)if(!ru[i])ans=max(ans,dfs(i));//考虑可能有多个入入度为0的点
printf("%d\n",ans);
return 0;
}
Luogu3387 缩点 【tarjan】【DP】的更多相关文章
- [模板][Luogu3387] 缩点 - Tarjan, 拓扑+DP
Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...
- 【模板】缩点 tarjan+dp
题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...
- UVA 11324.The Largest Clique tarjan缩点+拓扑dp
题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...
- BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )
WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就 ...
- 洛谷 P2515 [HAOI2010]软件安装(缩点+树形dp)
题面 luogu 题解 缩点+树形dp 依赖关系可以看作有向边 因为有环,先缩点 缩点后,有可能图不联通. 我们可以新建一个结点连接每个联通块. 然后就是树形dp了 Code #include< ...
- 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)
「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...
- P2272 [ZJOI2007]最大半连通子图 tarjan+DP
思路:$tarjan+DP$ 提交:1次 题解:首先对于一个强连通分量一定是一个半连通分量,并且形成的半连通分量的大小一定是它的$size$,所以我们先缩点. 这样,我们相当于要在新的$DAG$上找一 ...
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
- 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)
layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...
随机推荐
- Bigdecimal: Non-terminating decimal expansion; no exact representable decimal result.
做除法没有指定保留小数点后几位,就会抛出此异常. 因为会除不尽 Non-terminating decimal expansion; no exact representable decimal re ...
- vue-router的一个小实例
非2.0的 vue2.0还有vue-router2.0的改变还是挺大的 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于 ...
- 【转】爬取豆瓣电影top250提取电影分类进行数据分析
一.爬取网页,获取需要内容 我们今天要爬取的是豆瓣电影top250页面如下所示: 我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西.直接进入主题吧! 知道我们需要的内容在哪里了, ...
- MongoDB 查看所有用户账号信息
在 MongoDB 中创建了很多帐号,怎么查看所有帐号信息? 1. 查看全局所有账户 2. 查看当前库下的账户 查看全局所有账户 : > use admin switched to db adm ...
- 3.spring cloud eureka 高可用
1.目的 防止某一台服务器宕机 通常通过多台EUREKA来为客户端进行注册,客户也进行注册 2.开启三台EUREKA 三天EUREKA分别对应端口 8761 8762 8763 配置文件如下 EURE ...
- 【hive】子查询
hive中是不支持子查询的 但是并不意味这不支持in 或者 not in in 或者not in 后边是定值的话是支持的 但是接定制是可以的 例如 select id from table not i ...
- MongoHelper.cs
using System; using MongoDB.Bson; using MongoDB; using System.Web; using MongoDB.Driver; namespace Y ...
- js鼠标键禁用功能
页面完全禁用右键 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- 为eclipse EE(汉化版) 配置Tomcat服务器
为eclipse EE(汉化版) 配置Tomcat服务器 很多小朋友在初次使用eclipse进行web开发的时候,很是蒙蔽.以前都是文本编辑器写好,做好目录结构,往tomcat下一扔,重启,搞定. ...
- APUE学习笔记——11 线程同步、互斥锁、自旋锁、条件变量
线程同步 同属于一个进程的不同线程是共享内存的,因而在执行过程中需要考虑数据的一致性. 假设:进程有一变量i=0,线程A执行i++,线程B执行i++,那么最终i的取值是多少呢?似乎一定 ...