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出发,到达任 ...
随机推荐
- 在web项目中获取ApplicationContext上下文的3种主要方式及适用情况
最近在做web项目,需要写一些工具方法,涉及到通过Java代码来获取spring中配置的bean,并对该bean进行操作的情形.而最关键的一步就是获取ApplicationContext,过程中纠结和 ...
- GO-REDIS的一些高级用法
1. 前言 说到Golang的Redis库,用到最多的恐怕是redigo 和 go-redis.其中 redigo 不支持对集群的访问.本文想聊聊go-redis 2个高级用法 2. 开启对Clust ...
- 用xcode打包完成,出现的Archive界面怎么打开?
要出现这个界面 只需在xcode界面进入windows 的下拉菜单Organizer
- NOIp2017D1T2 时间复杂度【模拟】
说一说 题目分析请从目录空降... 没想到模拟题还会卡这么久...菜得真实... 这是一个励志的故事:从$0pts->9pts->18pts->27pts->36tps-> ...
- MySQL教程详解之存储引擎介绍及默认引擎设置
什么是存储引擎? 与其他数据库例如Oracle 和SQL Server等数据库中只有一种存储引擎不同的是,MySQL有一个被称为“Pluggable Storage Engine Architectu ...
- PLSQL中查到的数据和程序中查询到的不一样
1.首先看下你的修改或者新增的SQL是否提交.
- celery 调用scrapy
我的环境: celery 3.1.25 python 3.6.9 window10 celery tasks 代码如下,其中 QuotesSpider 是我的scrapy项目爬虫类名称 from ce ...
- python3.7 安装Scrapy 失败问题
python的Scrapy框架,需要Twisted依赖以及VC++ 14 以上的环境,这些就不再赘述.讲讲今天安装Twisted和Scrapy遇到的其他问题. 首先就是直接安装Twisted成功后,安 ...
- 从入门到自闭之Python入门
python是一门解释型编程语言 变量名命名的规则: 变量名由字母,数字,下划线组成 变量名不能以数字开头 变量名要具有可描述性 变量名要区分大小写 变量名禁止使用python关键字 变量名不能使用中 ...
- HTML5自学
1.1 标题文本 在HTML5中,文本的结构除了以行和段落出现之外,还可以作为标题存在,通常一篇文档最基本的结构就是由不同级别的标题和正文组成的. 例如1:(中国门户网站) https://www ...