[ZJOI2007]最大半联通子图

这个题,翻译一下题面,就是一个连通图,找他的最长链的数量。。。
所以说方法就比较明显了:tarjan缩点+拓扑+DP
注意也是本题唯一坑点,拓扑DP的时候要考虑重复边的情况。。。
呆码:
#include<iostream>
#include<cstdio>
#define N 100010
#define M 1000010
using namespace std; struct asd{
int nxt;
int to;
} a[M<<],b[M]; int head[M<<],headd[M],t[N],dfn[N],low[N],stack[N];
int num[N],belong[N],tmp[N],f[N],g[N],vis[N];
int sum,number,top,cnt,n,m,mo,mx,ans;
bool use[N]; inline void add(int x,int y)
{
a[++sum].nxt=head[x];
a[sum].to=y;
head[x]=sum;
} inline void bdd(int x,int y)
{
b[++sum].nxt=headd[x];
b[sum].to=y;
headd[x]=sum;
t[y]++;
} inline void tarjan(int u)
{
number++;
dfn[u]=low[u]=number;
stack[++top]=u;
use[u]=;
for(int i=head[u];i;i=a[i].nxt)
{
int v=a[i].to;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(use[v])
low[u]=min(low[u],dfn[v]);
}
int v;
if(dfn[u]==low[u])
{
cnt++;
do{
num[cnt]++;
v=stack[top--];
belong[v]=cnt;
use[v]=;
}while(u!=v);
}
} inline void rebuild()
{
for(int i=;i<=n;i++)
for(int j=head[i];j;j=a[j].nxt)
if(belong[i]!=belong[a[j].to])
bdd(belong[i],belong[a[j].to]);
} int main()
{
scanf("%d%d%d",&n,&m,&mo);
int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
} for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i);
sum=; rebuild(); int Head=,Tail=;
for(int i=;i<=cnt;i++)
{
if(!t[i]) tmp[++Tail]=i;
f[i]=num[i]; g[i]=;
}
while(Head<Tail)
{
int now=tmp[++Head];
for(int i=headd[now];i;i=b[i].nxt)
{
int v=b[i].to; t[v]--;
if(!t[v]) tmp[++Tail]=v;
if(vis[v]==now) continue;
if(f[now]+num[v]>f[v])
{
f[v]=f[now]+num[v];
g[v]=g[now];
}
else if(f[now]+num[v]==f[v])
g[v]=(g[v]+g[now])%mo;
vis[v]=now;
}
} for(int i=;i<=cnt;i++)
{
if(f[i]>mx) mx=f[i],ans=g[i];
else if(f[i]==mx) ans=(ans+g[i])%mo;
} printf("%d\n%d",mx,ans);
}
代码
[ZJOI2007]最大半联通子图的更多相关文章
- 【BZOJ1093】[ZJOI2007]最大半联通子图(Tarjan,动态规划)
[BZOJ1093][ZJOI2007]最大半联通子图(Tarjan,动态规划) 题面 BZOJ 洛谷 洛谷的讨论里面有一个好看得多的题面 题解 显然强连通分量对于题目是没有任何影响的,直接缩点就好了 ...
- bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序
最大半联通子图对应缩点后的$DAG$上的最长链 复杂度$O(n + m)$ #include <cstdio> #include <cstring> #include < ...
- [bzoj 1093][ZJOI2007]最大半联通子图(强联通缩点+DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093 分析: 首先肯定是先把强联通全部缩成一个点,然后成了一个DAG 下面要知道一点: ...
- BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)
题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...
- 【BZOJ1093】【ZJOI2007】最大半联通子图 [DP][Tarjan]
最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 一个有向图G=(V,E)称为 ...
- bzoj1093【ZJOI2007】最大半联通子图
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1093 sol :一开始理解错题意了QAQ,还莫名其妙写挂了QAQ,调了半天 首先显然一个强联 ...
- 洛谷 P2272 [ZJOI2007]最大半连通子图 解题报告
P2272 [ZJOI2007]最大半连通子图 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v \in V\),满 ...
- [ZJOI2007]最大半连通子图(Tarjan,拓扑序DP)
[ZJOI2007]最大半连通子图 题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...
- BZOJ 1093 [ZJOI2007]最大半连通子图
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1986 Solved: 802[Submit][St ...
随机推荐
- gateway + jwt 网关认证
思路: 全局过滤器对所有的请求拦截(生成token有效期30分钟,放入redis设置有效期3天.3天之类可以通过刷新接口自动刷新,超过3天需要重新登录.) 前端在调用接口之前先判断token是否过期( ...
- Flask最强攻略 - 跟DragonFire学Flask - 第十四篇 Flask-SQLAlchemy
前不久刚刚认识过了SQLAlchemy,点击这里复习一下 当 Flask 与 SQLAlchemy 发生火花会怎么样呢? Flask-SQLAlchemy就这么诞生了 首先要先安装一下Flask-SQ ...
- ajax跨域问题及相关解决方案
1 什么是跨域 所谓的跨域是指浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相同: 2 什么时候会存在跨域的问题 页面访问不同源 ...
- 时间序列数据库调研之InfluxDB
基于 Go 语言开发,社区非常活跃,项目更新速度很快,日新月异,关注度高 测试版本 1.0.0_beta2-1 安装部署 wget https://dl.influxdata.com/influxdb ...
- ukylin 使用deepin-wine
之前一直是使用deepin的,但是自打前阵子更新内核之后,我的显卡就总出问题,这里也顺便f**k下NVIDIA. 在装了十几二十遍系统之后我终于还是妥协了,deepin最近又更新了,不知道解决我的显卡 ...
- Python3 tkinter基础 Menubutton 点击按钮出现下拉菜单
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- P3346 [ZJOI2015]诸神眷顾的幻想乡
思路 注意到叶子节点(度数为1)只有20个,可以分别以这20个节点为根,把所有子串插入SAM中,统计最后的本质不同的子串个数 所以就是广义SAM了 然后注意要判断一下有无重复插入 代码 #includ ...
- mongodb 设置权限
切换到要加密的数据库use diary 创建有 readWrite 权限的用户db.createUser({ user: "youuser", pwd: "youpass ...
- MSSQL 数据库 buildindex 出错
错误1: Executing the query "ALTER INDEX [IX_liveConfigState_Service_ServiceId_..." failed wi ...
- 力扣(LeetCode)463. 岛屿的周长
给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相连(对角线方向不相连).整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地 ...