Gym - 101170B British Menu (强连通缩点+dp)
题意:求一个有向图上的最长路(每个强连通分量的点不超过5个)
首先对强连通分量缩点,暴力预处理出len[k][i][j]表示第k个强连通分量里的第i个点和第j个点之间的最长路径,设状态(k,i,f)表示在第k个强连通分量的第i个点,f表示是否已经在内部发生了转移(每个强连通分量内部只允许转移一次),然后记忆化搜索即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int n,m,hd[N],ne,low[N],dfn[N],nscc,scc[N],siz[N],sta[N],tp,tot;
int id[N],ID[N][],G[N][][],len[N][][],vis[],dp[N][][];
struct E {int v,nxt;} e[(int)1e6+];
void addedge(int u,int v) {e[ne]= {v,hd[u]},hd[u]=ne++;}
void Tarjan(int u) {
low[u]=dfn[u]=++tot,sta[++tp]=u;
for(int i=hd[u]; ~i; i=e[i].nxt) {
int v=e[i].v;
if(!dfn[v])Tarjan(v),low[u]=min(low[u],low[v]);
else if(!scc[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])for(++nscc; !scc[u];) {
int v=sta[tp--];
scc[v]=nscc,id[v]=siz[nscc]++,ID[scc[v]][id[v]]=v;
}
}
void dfs(int u,int l,int sc,int fr) {
if(vis[u])return;
vis[u]=;
len[sc][fr][u]=max(len[sc][fr][u],l);
for(int i=; i<siz[sc]; ++i)if(G[sc][u][i])dfs(i,l+,sc,fr);
vis[u]=;
}
int dfs2(int sc,int u,int f) {
int& ret=dp[sc][u][f];
if(~ret)return ret;
ret=;
int U=ID[sc][u];
for(int i=hd[U]; ~i; i=e[i].nxt) {
int V=e[i].v,v=id[V];
if(scc[U]!=scc[V])ret=max(ret,dfs2(scc[V],v,)+);
}
if(!f)for(int v=; v<siz[sc]; ++v)if(len[sc][u][v])
ret=max(ret,dfs2(sc,v,)+len[sc][u][v]);
return ret;
}
void getscc() {
memset(siz,,sizeof siz);
memset(dfn,,sizeof dfn);
tot=nscc=,tp=-;
for(int i=; i<=n; ++i)if(!dfn[i])Tarjan(i);
}
int main() {
memset(hd,-,sizeof hd),ne=;
scanf("%d%d",&n,&m);
while(m--) {
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
}
getscc();
memset(G,,sizeof G);
for(int u=; u<=n; ++u) {
for(int i=hd[u]; ~i; i=e[i].nxt) {
int v=e[i].v;
if(scc[u]==scc[v])G[scc[u]][id[u]][id[v]]=;
}
}
for(int i=; i<=nscc; ++i)
for(int j=; j<siz[i]; ++j)dfs(j,,i,j);
memset(dp,-,sizeof dp);
int ans=;
for(int i=; i<=n; ++i)ans=max(ans,dfs2(scc[i],id[i],));
printf("%d\n",ans+);
return ;
}
Gym - 101170B British Menu (强连通缩点+dp)的更多相关文章
- Gym - 101170B British Menu SCC点数目不超过5的最长路
题意其实就是给你一个有向图 但是每个SCC里面的点数目不超过5 求最长路 首先暴力把每个SCC里的每个点的最长路跑出来 然后拓扑排序dp 然后因为tarjan 搜索树出来的SCC是拓扑排好序的 可以直 ...
- UVA11324 The Largest Clique (强连通缩点+DP最长路)
<题目链接> 题目大意: 给你一张有向图 G,求一个结点数最大的结点集,使得该结点集中的任意两个结点 u 和 v 满足:要么 u 可以达 v,要么 v 可以达 u(u,v相互可达也行). ...
- ZOJ 3795 Grouping (强连通缩点+DP最长路)
<题目链接> 题目大意: n个人,m条关系,每条关系a >= b,说明a,b之间是可比较的,如果还有b >= c,则说明b,c之间,a,c之间都是可以比较的.问至少需要多少个集 ...
- CodeForces - 894E Ralph and Mushrooms (强连通缩点+dp)
题意:一张有向图,每条边上都有wi个蘑菇,第i次经过这条边能够采到w-(i-1)*i/2个蘑菇,直到它为0.问最多能在这张图上采多少个蘑菇. 分析:在一个强连通分量内,边可以无限次地走直到该连通块内蘑 ...
- UVA - 11324 The Largest Clique (强连通缩点+dp)
题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...
- UVA - 11324 The Largest Clique 强连通缩点+记忆化dp
题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...
- POJ3160 Father Christmas flymouse[强连通分量 缩点 DP]
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3241 Accep ...
- NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...
- BZOJ1179 [Apio2009]Atm Tarjan 强连通缩点 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1179 题意概括 有一个有向图,每一个节点有一个权值,其中有一些结束点. 现在,你要从S出发,到达任 ...
随机推荐
- JavaScript面向对象当中的几个概念
JS面向对象过程中的几个概念 前言 面向对象描述的是一种代码组织解构的形式,一种在软件中对真实世界中问题领域的建模方法. 下面将从理论层面来介绍下面向对象编程中一些常见的概念. 对象 所谓对象,本质上 ...
- 【Linux】常用基础命令
修改时间 date -s 月/日/年 例如:date -s 07/31/2019 date -s 时:分:秒 例如:date -s 23:56:50 hwclock -w 将时间写到bois,防止重启 ...
- Spark内核源码解析
1.spark内核架构常用术语 Application:基于spark程序,包含一个driver program(客户端程序)和多个executeor(线程) Driver Progrom:代表着sp ...
- react和vue配置本地代理
React 在react中配置开发环境下的本地代理相对比较简单,直接在package.json文件中修改即可. 但是这样做有其局限性,如果开发中代理多个接口的时候将无法满足需求,我们需要的是下面这种的 ...
- Python学习之初识
第一章 1.1 typora 的安装与使用 1.1.1 标题的创建: 方法一:用 ###+空格 表示标题,几个#就是几级标题 方法二:菜单栏-->段落-->选择标题 1.1.2 有序列表与 ...
- javascript预编译练习(变态篇)
例1. <!DOCTYPE html> <html> <head> <title></title> </head> <bo ...
- 保存cookie 到本地
#encoding: utf-8 from urllib import requestfrom http.cookiejar import MozillaCookieJar #创建一个cookieja ...
- Linux C/C++基础——内存分区
1.内存分区 在生活中,为了提高办事效率,某个单位经常会分成N个部门,每个部门职责不同,同样,为了提高 效率,我们的内存也会被分成N个区.这里我们将内存分为五个区.也有四区模型. 首先看一下一个二进制 ...
- Cannot get a NUMERIC value from a STRING cell? 已解决
最近在写项目中用到了excel的导入,遇到了Cannot get a NUMERIC value from a STRING cell的报错.原因是无法从纯数字的单元格用获取String的方式获取.跟 ...
- 跨 PostgreSQL 大版本复制怎么做?| 逻辑复制
当需要升级PostgreSQL时,可以使用多种方法.为了避免应用程序停机,不是所有升级postgres的方法都适合,如果避免停机是必须的,那么可以考虑使用复制作为升级方法,并且根据方案,可以选择使用逻 ...