您的位置:首页 > 其它

强连通分量——tarjan

2016-07-26 11:09 302 查看
#include<stdio.h>
#include<string.h>
#include<stack>
#include<vector>
#include<iostream>
#include<iomanip>
using namespace std;
stack<int> a;
vector<int> g[100];
bool instack[100];
int dfn[100],low[100],time;
void tarjan(int v)
{
dfn[v]=low[v]=++time;
a.push(v),instack[v]=true;
for(int i=0;i<g[v].size();i++)
if(!dfn[g[v][i]])
{
tarjan(g[v][i]);
low[v]=min(low[v],low[g[v][i]]);
}
else if(instack[g[v][i]]) low[v]=min(low[v],low[g[v][i]]);
if(dfn[v]==low[v])
{
while(a.top()!=v)
{
cout<<a.top()<<" ";
instack[a.top()]=false;
a.pop();
}
cout<<a.top()<<endl<<endl;
a.pop();
}
}
int main()
{
int n,m,x,y,i;
cin>>n>>m;
while(m--)
{
scanf("%d%d",&x,&y);
g[x].push_back(y);
}
memset(dfn,0,sizeof(dfn));
memset(instack,false,sizeof(instack));
while(!a.empty()) a.pop();
time=0;
for(i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: