正题

题目链接:https://www.luogu.com.cn/problem/P2272


题目大意

半连通图定义为任意两个点(u,v)(u,v)(u,v)满足uuu可以到vvv或vvv可以到uuu的有向图。

现在给出一张图,求最大半连通子图与其数量。


解题思路

显然一个强连通一定是一个半连通,所以我们可以先tarjantarjantarjan缩点。

可以发现半连通一定是缩完点之后的DAGDAGDAG上的一条链,所以我们可以用dpdpdp解决。

需要注意的是如果两条边连通两个相同缩完后的点,这些重边需要去掉,否则会对统计答案造成影响。

时间复杂度O(mlog⁡m+n)O(m\log m+n)O(mlogm+n),改用hashhashhash去重可以去掉那个log⁡m\log mlogm的复杂度


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int N=1e5+10;
struct node{int to,from,next;
}a[N*10];
int n,p,m,tot,cnt,num,ls[N];
int dfn[N],low[N],col[N],siz[N];
int f[N],g[N],in[N],ans;bool ins[N];
stack<int> s;queue<int> q;
void addl(int x,int y){a[++tot].to=y;a[tot].from=x;a[tot].next=ls[x];ls[x]=tot;return;
}
void tarjan(int x){dfn[x]=low[x]=++cnt;ins[x]=1;s.push(x);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if(ins[y])low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]){++num;while(s.top()!=x){ins[s.top()]=0;col[s.top()]=num;siz[num]++;s.pop();}ins[s.top()]=0;col[s.top()]=num;siz[num]++;s.pop();}return;
}
bool cmp(node x,node y)
{return (col[x.from]==col[y.from])?col[x.to]<col[y.to]:col[x.from]<col[y.from];}
void topsort(){for(int i=1;i<=num;i++){if(!in[i])q.push(i);f[i]=siz[i];g[i]=1;ans=max(ans,f[i]);}while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;in[y]--;if(f[x]+siz[y]>f[y])f[y]=f[x]+siz[y],g[y]=g[x];else if(f[x]+siz[y]==f[y])g[y]=(g[y]+g[x])%p;ans=max(ans,f[y]);if(!in[y])q.push(y);}}return;
}
int main()
{scanf("%d%d%d",&n,&m,&p);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);addl(y,x);}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);sort(a+1,a+1+tot,cmp);int pt=tot,lx=0,ly=0;tot=0;memset(ls,0,sizeof(ls));for(int i=1;i<=pt;i++){int x=a[i].from,y=a[i].to;if(col[x]==col[lx]&&col[y]==col[ly])continue;if(col[x]!=col[y])addl(col[y],col[x]),in[col[x]]++;lx=x;ly=y;}topsort();printf("%d\n",ans);int sum=0;for(int i=1;i<=n;i++)if(f[i]==ans)(sum+=g[i])%=p;printf("%d\n",sum);return 0;
}

P2272-[ZJOI2007]最大半连通子图【tarjan,缩点】相关推荐

  1. 解题报告:luogu P2272 [ZJOI2007]最大半连通子图(tarjan缩点、递推DP、hash、set判重)

    这时yxc上课时讲解的截图. 一般用到tarjan算法的题目步骤都非常相似: tarjan算法 缩点,建图(这里要判重) 按照拓扑序递推(这里缩点以后逆向就已经是拓扑序了)/ 循环遍历新图求解答案. ...

  2. BZOJ 1093 [ZJOI2007]最大半连通子图

    1093: [ZJOI2007]最大半连通子图 Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 ...

  3. tyvj——P3524 最大半连通子图

    P3524 最大半连通子图 时间: 3000ms / 空间: 165536KiB / Java类名: Main 描述 输入格式 第一行包含两个整数N,M,X.N,M分别表示图G的点数与边数,X的意义如 ...

  4. BZOJ 1093 ZJOI 2007 最大半连通子图 强联通分量+拓扑图DP

    今天是放假的第一天(不说什么废话了) 什么是半连通子图?就是此图中包含的所有点两两点之间至少有一条单向路径. 题目问了两个问题 1.最大半连通子图的大小 2.最大半连通子图的个数 好了,这个问题看上去 ...

  5. 有向图的强连通分量——最大半联通子图

    最大半联通子图 一个有向图 G=(V,E)G=(V,E)G=(V,E) 称为半连通的 (Semi-Connected),如果满足:∀u,v∈V,满足u→v或v→u∀u,v∈V,满足 u→v 或 v→u ...

  6. Tarjan缩点/边双/点双

    文章目录 代码实现 实际应用 1.有向图 另外:对于缩点之后的DAG的处理 2.无向图 求法 细节 细节: 目录: 1.「POJ 3694」Network 2.「2019 ICPC 横滨站」 3. P ...

  7. 有向图的强联通分量之:【求最长链】【求最长链的方案数(图论中的方案数DP)】【最长链和最大半联通子图 节点数相同】【最长链与最大半联通子图等价又不完全等价】

    注意了: 最长链与最大半联通子图是等价又不完全等价的. 最大半联通子图的节点数 会 与最长链的节点数相同, 但是边数的话,最大半联通子图还是会加进 两个点之间的所有边 但是本题的主要目的是求 最长链上 ...

  8. 【BZOJ1051】受欢迎的牛,tarjan缩点重构图

    Time:2016.05.18 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: (自己不必认为自己受欢迎) tarjan缩点然后重构图 一个强连通分量里肯定是相互认为受欢迎的 重构图 ...

  9. 2017.9.2 最大半联通子图 思考记录

    这个题一看上去似乎很难,,   半联通子图根本就没听说过啊 但经过一段时间的思考之后似乎模型挺直接的. 但是其实,他就是问你一个选点最多的路径. 因为如果这些点如果不能能构成一条路径的话,不在路径上的 ...

最新文章

  1. 电脑任务管理器_安国戴尔电脑显示器维修,服务至上
  2. Transformer再度出手!low-level多个任务榜首被占领,
  3. 52. N-Queens II N皇后II
  4. 吴恩达 coursera AI 专项二第二课总结+作业答案
  5. AutoCAD VBA对齐对象
  6. powershell 遍历json_使用PowerShell处理JSON字符串
  7. 使用Java EE 8中的反应式API加速服务
  8. python高级玩法_python pandas to_excel 高级玩法
  9. c#12星座速配代码_白羊座今日运势|2020/12/11
  10. uuid会重复吗_记一次订单号重复的事故,快看看你的 UUID 在并发下还正确吗?...
  11. mysql关键字 distinct去重
  12. iOS -- SKPhysicsJointSpring类
  13. 阿里云服务器ddos攻击防御
  14. java file 只读_Java如何设置文件为只读?
  15. 第十六天(配置BPDU,TCN BPDU)
  16. OpenCV学习之路(附加资料分享)
  17. 示波器的各种文件存储方式与分析
  18. AI之NLP:2020年6月21日北京智源大会演讲分享之15:15-15:40黄萱菁教授《自然语言处理中的表示学习》
  19. python在Scikit-learn中用决策树和随机森林预测NBA获胜者
  20. 618 都疯了吗?这些书居然都不到半价!

热门文章

  1. lisp正负调换_坐标提取lisp程序
  2. 在鹅厂,我作为一个Java 程序员每天都在摸鱼!!!
  3. ksu7对讲机调频软件_数字对讲机的群呼功能原理是什么?你了解多少?
  4. git revert 后再次merge_git如何回滚错误合并的分支
  5. [JavaWeb-JavaScript]JavaScript运算符
  6. python矩阵教程_numpy教程:矩阵matrix及其运算
  7. word List16
  8. php7 ast,PHP7新特性之抽象语法树(AST)带来的变化详解
  9. erlang rebar 配置mysql_Erlang Rebar 使用指南之四:依赖管理
  10. HashMap实现LRU(最近最少使用)缓存更新算法