题目

好久没法博客了

这次就水个板子题目吧

tarjan缩点之后重新建图

而且边权应该都是正的(要不我怎么能这么轻松水过去)

在新图上记忆化一下就好了

f[i] 表示 开头选i这个点 的 路径最大值

#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e5+7;
int n,m,w[maxn],f[maxn];
int stak[maxn],top,vis[maxn],dfn[maxn],low[maxn],cnt;//一套trajan
int color[maxn],color_tot,color_w[maxn];//一套染色数组
struct edge {
int u,v,nxt;
}old_e[maxn],new_e[maxn];
int old_head[maxn],old_tot;
int new_head[maxn],new_tot;
void add1(int u,int v) {
old_e[++old_tot].u=u;
old_e[old_tot].v=v;
old_e[old_tot].nxt=old_head[u];
old_head[u]=old_tot;
}
void add2(int u,int v) {
new_e[++new_tot].v=v;
new_e[new_tot].nxt=new_head[u];
new_head[u]=new_tot;
}
void tarjan(int u) {
dfn[u]=low[u]=++cnt;
vis[u]=1;
stak[++top]=u;
for(int i=old_head[u];i;i=old_e[i].nxt) {
int v=old_e[i].v;
if(!dfn[v]) {
tarjan(v);
dfn[u]=min(dfn[u],dfn[v]);
} else
if(vis[v])
dfn[u]=min(dfn[u],low[v]);
}
if(dfn[u]==low[u]) {
++color_tot;
while(stak[top]!=u) {
vis[stak[top]]=0;
color_w[color_tot]+=w[stak[top]];
color[stak[top--]]=color_tot;
}
top--;
color[u]=color_tot;
color_w[color_tot]+=w[u];
vis[u]=0;
}
}
//f[i] 表示 开头选i这个点的路径最大值
int dfs(int u)
{
if(f[u]) return f[u];
int tmp=0;
for(int i=new_head[u];i;i=new_e[i].nxt) {
int v=new_e[i].v;
tmp=max(tmp,dfs(v));
}
if(!tmp) return f[u]=color_w[u];
return f[u]=color_w[u]+tmp;
}
int main()
{
//freopen("testdata.in","r",stdin);
//读入
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&w[i]);
for(int i=1;i<=m;++i) {
int u,v;
scanf("%d%d",&u,&v);
add1(u,v);
}
//缩点
for(int i=1;i<=n;++i)
if(!dfn[i])
tarjan(i);
//建新图
for(int i=1;i<=old_tot;++i)
if(color[old_e[i].u]!=color[old_e[i].v])
{
add2(color[old_e[i].u],color[old_e[i].v]);
//cout<<color[old_e[i].u]<<" -> "<<color[old_e[i].v]<<"\n";
}
//记忆化搜索
int ans=0;
for(int i=1;i<=color_tot;++i)
ans=max(ans,dfs(i));
//输出ans
printf("%d\n",ans);
return 0;
}

luogu P3387 【模板】缩点的更多相关文章

  1. 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)

    Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...

  2. [luogu P3384] [模板]树链剖分

    [luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点 ...

  3. Luogu P2742 模板-二维凸包

    Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...

  4. luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)

    luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...

  5. 解题报告+板子:luogu P3387 【模板】缩点

    题目链接:P3387 [模板]缩点 缩点板子,所谓\(dp\)就是拓扑排序(毕竟可以重走边),像\(SPFA\)一样松弛就好,就是重边极其烦人,还加了排序(绝对自己想的,然鹅拓扑的思路不是). 下面上 ...

  6. LUOGU P3387 【模板】缩点 (缩点+DAG dp)

    解题思路 缩点后按拓扑排序跑一个dp. #include<iostream> #include<cstdio> #include<cstring> #include ...

  7. luogu P3387 【模板】缩点_拓扑排序

    还是很好些的. Code: #include <stack> #include <cstdio> #include <algorithm> #include < ...

  8. Tarjan+topsort(DP)【P3387】 [模板]缩点

    Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...

  9. [模板](luogu P3387)縮點

    前言:對於這週的咕咕咕表示好像沒什麼好表示的,完全沒有靈感a......寫東西真的好難啊......於是又玩了半天鬼泣4???還挺好玩的 來源:題解 题目背景 缩点+DP 题目描述 给定一个n个点m条 ...

随机推荐

  1. WebWorker的浏览器"异步线程"

    worker新线程: 1.通过postMessage( data ) 方法来向主线程发送数据; 2.绑定onmessage方法来接收主线程发送过来的数据:   3.worker外部文件不允许使用win ...

  2. mybatis中大于等于、小于等于的写法

    在xml格式中,常常会遇到xml解析sql时候出错,这个时候需要用其他符号来表示.在mybatis中会遇到,需要做如下的转换:

  3. Mayor's posters---poj2528线段树、离散化

    题目链接:http://poj.org/problem?id=2528 题意:有n张海报要贴,每张需要用的区间为L到R,后面的可以贴在之前的上面,就是吧之前的挡住,求最后我们能看到几张海报: 我们可以 ...

  4. [记录]Visual Studio 插件

    NuGet Resharper Viasfora : 着色 ozcode2 : 调试 dbforge  调试 phptools vsdoc man DebugStudio Alpha Producti ...

  5. 多作者wordpress博客彻底屏蔽可视化编辑

    如果你的wordpress博客支持多作者,但是难免有些作者会加入过多的链接,怎么办呢?可以考虑屏蔽可视化编辑 在 functions.php 添加如下代码即可: add_filter('user_ca ...

  6. Android应用之——百度地图最新SDK3.0应用,实现最经常使用的标注覆盖物以及弹出窗覆盖物

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yanglfree/article/details/33333413 一.概述 最新版的百度地图SDK ...

  7. Win10+vs2012+cuda8.0的安装与配置

    安装环境说明:NVDIA GeForce 930M.Intel(R) HD Graphics 520 显卡和cuda需要兼容匹配,我一开始下载的cuda6.5无法安装,所以又重新下了比较新的cuda8 ...

  8. ASCII对照表

    ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUT 32 (space) 64 @ 96 . 1 SOH 33 ! 65 A 97 a 2 ST ...

  9. 智能指针 - 现代C++新特性总结

    C++98中的智能指针通过一个模板类auto_ptr来实现,new操作符返回的指针可以交由它来管理,程序员不用再显式的调用delete,这在一定程度上避免了堆内存忘记释放的问题:不过auto_ptr有 ...

  10. spring 装配集合

    1:创建pojo,属性包含集合,集合元素为基本类型 package com.liyafei.pojo; import java.util.List; import java.util.Map; imp ...