【BZOJ1093】[ZJOI2007]最大半联通子图(Tarjan,动态规划)
【BZOJ1093】[ZJOI2007]最大半联通子图(Tarjan,动态规划)
题面
题解
显然强连通分量对于题目是没有任何影响的,直接缩点就好了。
那么接下来剩下的是一个\(DAG\),既然任意两点之间都有一条路径连接,在\(DAG\)上的体现就是这个玩意一定是一条链。随便\(dp\)一下就好了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define MAX 100100
#define MAXL 1000100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
vector<int> E[MAX];
struct Line{int v,next;}e[MAXL];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int dfn[MAX],low[MAX],S[MAX],G[MAX],sz[MAX],tim,top,gr,len[MAX];
int dg[MAX],p[MAX],f[MAX],g[MAX],tot;
bool ins[MAX];
void Tarjan(int u)
{
S[++top]=u;dfn[u]=low[u]=++tim;ins[u]=true;
for(int i=h[u];i;i=e[i].next)
if(!dfn[e[i].v])
Tarjan(e[i].v),low[u]=min(low[u],low[e[i].v]);
else if(ins[e[i].v])
low[u]=min(low[u],dfn[e[i].v]);
if(dfn[u]==low[u])
{
++gr;int v;
do{v=S[top--];ins[v]=false;G[v]=gr;++sz[gr];}while(u!=v);
}
}
void Topsort()
{
queue<int> Q;
for(int i=1;i<=gr;++i)if(!dg[i])Q.push(i),E[0].push_back(i),++len[0];
while(!Q.empty())
{
int u=Q.front();Q.pop();p[++tot]=u;
for(int i=0;i<len[u];++i)
if(!--dg[E[u][i]])Q.push(E[u][i]);
}
}
int n,m,MOD;
int main()
{
n=read();m=read();MOD=read();
for(int i=1,u,v;i<=m;++i)u=read(),v=read(),Add(u,v);
for(int i=1;i<=n;++i)if(!dfn[i])Tarjan(i);
for(int u=1;u<=n;++u)
for(int i=h[u];i;i=e[i].next)
if(G[u]!=G[e[i].v])
E[G[u]].push_back(G[e[i].v]);
for(int i=1;i<=gr;++i)sort(E[i].begin(),E[i].end());
for(int i=1;i<=gr;++i)len[i]=unique(E[i].begin(),E[i].end())-E[i].begin();
for(int i=1;i<=gr;++i)
for(int j=0;j<len[i];++j)
++dg[E[i][j]];
Topsort();
for(int i=gr;~i;--i)
{
int u=p[i];f[u]=sz[u];g[u]=1;
for(int j=0;j<len[u];++j)
{
int v=E[u][j];
if(f[u]<sz[u]+f[v])
f[u]=sz[u]+f[v],g[u]=g[v];
else if(f[u]==sz[u]+f[v])
g[u]=(g[u]+g[v])%MOD;
}
}
printf("%d\n%d\n",f[0],g[0]);
return 0;
}
【BZOJ1093】[ZJOI2007]最大半联通子图(Tarjan,动态规划)的更多相关文章
- bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序
最大半联通子图对应缩点后的$DAG$上的最长链 复杂度$O(n + m)$ #include <cstdio> #include <cstring> #include < ...
- BZOJ1093: [ZJOI2007]最大半连通子图(tarjan dp)
题意 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G' ...
- BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )
WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就 ...
- [ZJOI2007]最大半连通子图 (Tarjan缩点,拓扑排序,DP)
题目链接 Solution 大概是个裸题. 可以考虑到,如果原图是一个有向无环图,那么其最大半联通子图就是最长的一条路. 于是直接 \(Tarjan\) 缩完点之后跑拓扑序 DP就好了. 同时由于是拓 ...
- Luogu P2272 [ZJOI2007]最大半连通子图(Tarjan+dp)
P2272 [ZJOI2007]最大半连通子图 题意 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v\in V\) ...
- [bzoj 1093][ZJOI2007]最大半联通子图(强联通缩点+DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093 分析: 首先肯定是先把强联通全部缩成一个点,然后成了一个DAG 下面要知道一点: ...
- BZOJ1093 [ZJOI2007]最大半连通子图 【tarjan缩点 + DAG最长路计数】
题目 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G ...
- bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- 【bzoj1093】[ZJOI2007]最大半连通子图 Tarjan+拓扑排序+dp
题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:对于u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. ...
随机推荐
- 一文让您全面了解清楚HBase数据库的所有知识点,值得收藏!
一.HBase基本概念:列式数据库 在Hadoop生态体系结构中,HBase位于HDFS(Hadoop分布式文件系统)的上一层,不依赖于MapReduce,那么如果没有HBase这种Nosql数据库会 ...
- 20155211 网络对抗 Exp9 Web安全基础实践
20155211 网络对抗 Exp9 Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语 ...
- 2017-2018-2 20155310『网络对抗技术』Exp5:MSF基础应用
2017-2018-2 20155310『网络对抗技术』Exp5:MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:由攻击者或渗透测试者利 ...
- Linux 学习日记 1
这是我第一次系统地学习Linux,希望通过这个学习日记收获一些东西把-- @_@ Grub - 启动管理器 在启动时让用户选择要启动的系统.(但是windows比较霸道--重装windows后会将 ...
- html点击链接打开新窗口
html标记中格式为<a href="url"> text </a> 此时,内容在原来窗口呈现,如果想新开窗口,可以采用下列方式. 1. <a hre ...
- springboot项目生成jar包(带静态资源)方法
[Maven]在pom.xml文件中使用resources插件的小作用 不过war包比较实用,毕竟独立的tomcat比较好控制
- idea 迁移maven项目出现导入仓库半天没反应的问题解决
可以先参考: https://www.cnblogs.com/kinome/p/10289212.html 然后再看看maven配置文件是否正确,项目进行迁移时,如果环境不同,比如一个是使用的自定义m ...
- TensorFlow 训练MNIST数据集(2)—— 多层神经网络
在我的上一篇随笔中,采用了单层神经网络来对MNIST进行训练,在测试集中只有约90%的正确率.这次换一种神经网络(多层神经网络)来进行训练和测试. 1.获取MNIST数据 MNIST数据集只要一行代码 ...
- OPPO A7X 刷机小结
OPPO A7X 刷机小结: 概述:根据网上找到的教程(MTK模式刷机教程),没有成功.在QQ上询问一位提供刷机服务的大神,说是只有老版本才能刷. 操作步骤: 刷机工具: MediaTek SP Fl ...
- Python在函数中使用*和**接收元组和列表
http://blog.csdn.net/delphiwcdj/article/details/5746560