首页 > 代码库 > tarjan
tarjan
#include <bits/stdc++.h> #define MAXN 400010 using namespace std; vector<int>v[MAXN]; bool sign[MAXN]; int dfn[MAXN],low[MAXN]; pair<int,int>belong[MAXN]; int num=0; int tot=0; int curr=0; stack<int>sta; void tarjan(int a/*,int pre*/) { sta.push(a); sign[a]=true; dfn[a]=low[a]=++curr; for(int i=0;i<v[a].size();i++) { int b=v[a][i]; if(!sign[b]) { tarjan(b/*,a*/); low[a]=min(low[a],low[b]); } else //if(b!=pre) low[a]=min(low[a],dfn[b]);//感觉这地方的dfn[b]可以替换成low[b] } if(dfn[a]==low[a]) { while(sta.top()!=a) { belong[num++]=make_pair(sta.top(),tot); sta.pop(); } belong[num++]=make_pair(sta.top(),tot++); sta.pop(); } } int main() { int n,m; scanf("%d%d",&n,&m); int a,b; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); v[a].push_back(b); } for(int i=1;i<=n;i++) if(!sign[i]) tarjan(i/*,i*/); if(n) printf("%d",belong[0].first); for(int i=1;i<num;i++) { if(belong[i].second==belong[i-1].second) printf(" %d",belong[i].first); else printf("\n%d",belong[i].first); } if(n) printf("\n"); return 0; }
如果去掉注释符号就是双向边的.
tarjan
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。