首页 > 代码库 > 模板——Tarjan
模板——Tarjan
#include <cstdio>#include <cstring>#include <iostream>#include <vector>using namespace std;const int maxn=2000;vector<int>tu[maxn];vector<int>lt[maxn];int n,m,lts=0;int js=0;int dfn[maxn],low[maxn];int zhan[maxn],top=0;bool isins[maxn];void tarjan(int i){ int j; dfn[i]=low[i]=++js; isins[i]=1; zhan[top++]=i; for(int j=0;j<tu[i].size();j++) { int tp=tu[i][j]; if(dfn[tp]==-1) tarjan(tp), low[i]=min(low[i],low[tp]); else if(isins[tp]) low[i]=min(low[i],dfn[tp]); } if(dfn[i]==low[i]) { lts++; do{ j=zhan[--top]; isins[j]=0; lt[lts].push_back(j); }while(i!=j); }}void solve(int n){ memset(dfn,-1,sizeof dfn); memset(low,-1,sizeof low); memset(zhan,-1,sizeof zhan); memset(isins,0,sizeof isins); for(int i=0;i<n;i++) if(dfn[i]==-1) tarjan(i);}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); tu[x].push_back(y); } solve(n); for(int i=1;i<=lts;i++) { cout<<i<<":"; for(int j=0;j<lt[i].size();j++) cout<<lt[i][j]<<" "; cout<<endl; } return 0;}
模板——Tarjan
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。