Tarjan
来源:互联网 发布:python 文字水印 编辑:程序博客网 时间:2024/06/05 20:20
花了很长时间去理解Tarjan
因为看ppt时 自动略过了有文字的一页
导致后面的怎么也想不明白
以下参考曹文老师课件:
一个讲tarjan讲的很详细的博客:http://blog.csdn.net/jeryjeryjery/article/details/52829142?locationNum=4&fps=1
重点理解:
代码实现的时候花了很长时间
小心细节
静态调试很重要
有时候是自己生成的数据错了
具体实现:
#include<bits/stdc++.h>#define maxn 100005#define maxm 300005using namespace std;template <typename T> void read(T &x){x=0;int f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';x*=f;}int n,m;int cnt;int head[maxn],tot;bool vis[maxn];int to[maxm],nxt[maxm];int st[maxn],top,dfs_num;int dfn[maxn],low[maxn];void add(int u,int v){++tot;to[tot]=v;nxt[tot]=head[u];head[u]=tot; }void Tarjan(int x){dfn[x]=low[x]=++dfs_num;vis[x]=1;st[++top]=x;for(int e=head[x];e;e=nxt[e]){if(!dfn[to[e]]){Tarjan(to[e]);low[x]=min(low[x],low[to[e]]);}else if(vis[to[e]]) low[x]=min(low[x],dfn[to[e]]);}if(dfn[x]==low[x]){//cout<<x<<endl;++cnt;int j;do{j=st[top--];cout<<j<<" ";vis[j]=0;}while(j!=x);cout<<endl;}}int main(){read(n),read(m);for(int i=1;i<=m;++i){int u,v;read(u),read(v);add(u,v);}memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(vis,0,sizeof(vis));memset(st,0,sizeof(st));for(int i=1;i<=n;++i) if(!dfn[i]) Tarjan(i); //for(int i=1;i<=n;++i) cout<<dfn[i]<<" "<<low[n]<<endl;cout<<cnt<<endl; return 0;}
阅读全文
0 0
- tarjan
- Tarjan
- Tarjan
- tarjan
- tarjan
- tarjan
- Tarjan
- Tarjan
- Tarjan
- Tarjan
- Tarjan
- tarjan
- Tarjan
- Tarjan
- Tarjan
- tarjan
- tarjan算法
- hdoj1269 Tarjan
- 二分查找算法及python实现
- 微擎多个平台、域名共用一个公众号Oauth回调域名终极解决方案
- CentOS 7 下网络管理之命令行工具nmcli
- iOS 集合的深复制与浅复制
- 接口自动化测试环境搭建(unittest+requests+HTMLTestRunner)
- Tarjan
- bzoj1692 后缀数组模板
- Logback使用
- 006 函数极限性质之保号性及局部有界性
- 大数据(二十)Hive【Hive安装配置(远端数据库模式)】
- 关于修改java代码后得重启Tomcat等服务器的问题
- 无穷小放飞互联网,告慰恩师在天之灵
- android listview adapter 不调用getview的问题
- Docker Oracle Linux