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开发常识
web开发基本常识 服务器(硬件) 维基百科定义: 服务器作为硬件来说,通常是指那些具有较高计算能力,能够提供给多个用户使用的计算机.服务器与PC机的不同点很多,例如PC机在一个时刻通常只为一个用户服 ...
- unity混音
前言在游戏中,通常我们需要控制整个游戏的主音量(全局音量),并且单独控制背景音乐和其他音效(攻击.爆炸之类)的音量,这时我们可以用Audio Mixer来解决. 如果文章中有哪些地方写的不对, 欢迎指 ...
- OpenStack组件——Nova计算资源管理
1.nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...
- eclipse -------导出war包
1.右键工程名--Export----- WAR file 2.输入war包名,选择导出路径,finish完成
- lua编译器和ide
这里有一个网址,上面记录了大部分流行的LUA开发工具,包括IDE和Editor. http://www.wowwiki.com/Lua_editors 一.Eclipse LDT 1.语法高亮,自动提 ...
- [转] DLL加载方式
静态加载: 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib ...
- centos7安装activemq5.15
1. 官网下载 http://activemq.apache.org/components/classic/download/ 上传到服务器 2. 安装 tar zxf apache-activemq ...
- python网络编程-socket套接字通信循环-粘包问题-struct模块-02
前置知识 不同计算机程序之间数据的传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...
- spark教程(六)-Python 编程与 spark-submit 命令
hadoop 是 java 开发的,原生支持 java:spark 是 scala 开发的,原生支持 scala: spark 还支持 java.python.R,本文只介绍 python spark ...
- 通过设置访问密码查看Tomcat服务器运行状态
安装tomcat 设置访问manager用户名,密码 vim /usr/local/tomcat9/conf/tomcat-users.xml # 设置访问manager用户名,密码 # 在倒数第二行 ...