题意:求一个有向图上的最长路(每个强连通分量的点不超过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)的更多相关文章

  1. Gym - 101170B British Menu SCC点数目不超过5的最长路

    题意其实就是给你一个有向图 但是每个SCC里面的点数目不超过5 求最长路 首先暴力把每个SCC里的每个点的最长路跑出来 然后拓扑排序dp 然后因为tarjan 搜索树出来的SCC是拓扑排好序的 可以直 ...

  2. UVA11324 The Largest Clique (强连通缩点+DP最长路)

    <题目链接> 题目大意: 给你一张有向图 G,求一个结点数最大的结点集,使得该结点集中的任意两个结点 u 和 v 满足:要么 u 可以达 v,要么 v 可以达 u(u,v相互可达也行). ...

  3. ZOJ 3795 Grouping (强连通缩点+DP最长路)

    <题目链接> 题目大意: n个人,m条关系,每条关系a >= b,说明a,b之间是可比较的,如果还有b >= c,则说明b,c之间,a,c之间都是可以比较的.问至少需要多少个集 ...

  4. CodeForces - 894E Ralph and Mushrooms (强连通缩点+dp)

    题意:一张有向图,每条边上都有wi个蘑菇,第i次经过这条边能够采到w-(i-1)*i/2个蘑菇,直到它为0.问最多能在这张图上采多少个蘑菇. 分析:在一个强连通分量内,边可以无限次地走直到该连通块内蘑 ...

  5. UVA - 11324 The Largest Clique (强连通缩点+dp)

    题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...

  6. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  7. POJ3160 Father Christmas flymouse[强连通分量 缩点 DP]

    Father Christmas flymouse Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 3241   Accep ...

  8. NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序

    原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...

  9. BZOJ1179 [Apio2009]Atm Tarjan 强连通缩点 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1179 题意概括 有一个有向图,每一个节点有一个权值,其中有一些结束点. 现在,你要从S出发,到达任 ...

随机推荐

  1. ASP.NET(C#) 面试总结面试题大全

    一.对于 Web 性能优化,您有哪些了解和经验吗?出现指数:五颗星主要考点:这道题是博主在博客园的新闻里面看到的,回想之前几年的面试经历,发现此题出现概率还是比较高的.因为它的考面灰常广,可以让面试官 ...

  2. OpenStack组件——cinder存储服务

    1.cinder 介绍 1)理解 Block Storage 操作系统获得存储空间的方式一般有两种: (1)通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文 ...

  3. Windows 10 搭建 Django 环境(详细教程)

    Windows 10 搭建 Django 环境(详细教程) https://blog.csdn.net/HappyLittleMouse/article/details/81360272#1.%20P ...

  4. webdriervAPI(By声明定位方法)

    from  selenium  import  webdriver from  selenium.webdriver.common.by  import  By 导入By方法 driver  =  w ...

  5. so的封装和使用

    背景 在linux平台下,要实现函数的封装,一般采用的是so动态库的形式 实现了函数的封装就意味着实现过程的隐藏 可以实现跨平台和跨语言的使用 实施步骤 生成so动态库 编写相应的c文件代码,实现函数 ...

  6. Redhat更换Centos源

    redhat默认自带的yum源需要注册,才能更新,报错: This system is not registered to Red Hat Subscription Management. You c ...

  7. 基于Hadoop伪分布式集群搭建Spark

    一.前置安装 1)JDK 2)Hadoop伪分布式集群 二.Scala安装 1)解压Scala安装包 2)环境变量 SCALA_HOME = C:\ProgramData\scala-2.10.6 P ...

  8. Mysql8 root密码忘记了

    需要确定自己的mysql版本是否是8 [root@smonitor ~]# mysql --version mysql Ver 8.0.13 for Linux on x86_64 (MySQL Co ...

  9. Spring配置redis及使用

    一.redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. ...

  10. Select2的远程数据操作

    一.概述 如果下拉列表框中的内容太多,最好是使用Select2的远程数据进行筛选. 二.参考文献 https://select2.github.io/examples.html#data-ajax h ...