博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
受欢迎的牛(Tarjan缩点模板)
阅读量:5214 次
发布时间:2019-06-14

本文共 1512 字,大约阅读时间需要 5 分钟。

#include
#include
#include
using namespace std;int n,m,head[10005],vis[10005],dfn[10005],low[10005],color[10005],num[10005],out[10005];int sum,cnt,tot,jia,ans;stack
s;struct edge{ int v,next;}e[50005];inline void add(int u,int v){ e[++cnt].v=v; e[cnt].next=head[u]; head[u]=cnt;}inline void tarjan(int u){ vis[u]=1; s.push(u); dfn[u]=low[u]=++tot; for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].v; if(!dfn[v]){ tarjan(v); low[u]=min(low[v],low[u]); } else if(vis[v])low[u]=min(low[v],low[u]); } if(dfn[u]==low[u]){ color[u]=++sum; vis[u]=0; while(1){ int x=s.top(); s.pop(); vis[x]=0; color[x]=sum; num[sum]++; if(x==u)break; } }}inline void shrink(){ for(int u=1;u<=n;u++){ for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].v; if(color[v]!=color[u])out[color[u]]++; } }}int main(){ memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v); } for(int i=1;i<=n;i++){ if(!dfn[i])tarjan(i); } shrink(); for(int i=1;i<=sum;i++){ if(out[i]==0){ jia++; ans=num[i]; } } if(jia==1)printf("%d\n",ans); else printf("%d\n",0);}

转载于:https://www.cnblogs.com/Y15BeTa/p/11525295.html

你可能感兴趣的文章
比callback更简洁的链式执行promise
查看>>
android permission
查看>>
javascript获取textarea中所选文本的开始位置、结束位置和选择的文本
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
事务备份还原分离附加
查看>>
JSch - Java实现的SFTP(文件上传详解篇)
查看>>
一些注意点
查看>>
.net 文本框只允许输入XX,(正则表达式)
查看>>
C#修饰符
查看>>
20.核心初始化之异常向量表
查看>>
[BSGS][哈希]luogu P3846 可爱的质数
查看>>
Python 第四十五章 MySQL 内容回顾
查看>>
iostat参数说明
查看>>
js 封装获取元素的第一个元素
查看>>
iOS 获取Home键指纹验证
查看>>
Python-Mac 安装 PyQt4
查看>>
P2571 [SCOI2010]传送带
查看>>
哈希表1
查看>>
用Data Url (data:image/jpg;base64,)将小图片生成数据流形式
查看>>
实验2-2
查看>>