#include<iostream>
#include<cstring>
#include<stack>
#include<vector>
using namespace std;
const int MAXN=1000+10;
stack<int> s;
vector<int> g[MAXN];
int n,m;
int Intex,dfn[MAXN],low[MAXN];
int scc[MAXN],cnt;
bool instack[MAXN];
void tarjan(int u)
{
dfn[u]=low[u]=++Intex;
s.push(u);
instack[u]=true;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(dfn[v]==-1)
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
cnt++;
int v;
do
{
v=s.top();
s.pop();
scc[v]=cnt;
instack[v]=false;
}
while(u!=v);
}
}
int main()
{
memset(dfn,-1,sizeof(dfn));
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
g[x].push_back(y);
}
for(int i=1;i<=n;i++)
if(dfn[i]<0)tarjan(i);
cout<<cnt<<endl;
return 0;
}
【算法模板】Tarjan求强连通分量
猜你喜欢
转载自blog.csdn.net/ezluoyiqi/article/details/82957504
今日推荐
周排行