找强连通分量的个数,该算法也可用来找割点
推荐链接,看完就很好懂了,
https://blog.csdn.net/tjcwt2011/article/details/107156631
#include<bits/stdc++.h>
using namespace std;
int dfn[10007]={0},low[10007]={0},insak[10007]={0};
vector<int>arr[10007];
int st[10007]={0};
int dex=1,len=0,cnt=0;
int n,m,x,y;
void tarjan(int input)
{
dfn[input]=dex++;
low[input]=dfn[input];
insak[input]=1;
st[cnt++]=input;
for(int i=0;i<arr[input].size();i++)
{
int t=arr[input][i];
if(dfn[t]==0)
{
tarjan(t);
low[input]=min(low[input],low[t]);
}
else if(insak[t])
{
low[input]=min(low[input],dfn[t]);
}
}
arr[input].clear();
if(dfn[input] == low[input])
{
len++;
int j=0;
do{
j=st[cnt];insak[j]=0;cnt--;
}while(j!=input);
}
return ;
}
int main()
{
//freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
while (~scanf("%d%d",&n,&m)&&(m||n))
{
memset(dfn,0,sizeof(dfn));memset(insak,0,sizeof(insak));
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
arr[x].push_back(y);
}
for(int i=1;i<=n;i++)
{
if(dfn[i]==0)tarjan(i);
}
if(len == 1)
cout << "Yes" << endl;
else
cout << "No" << endl;
len=0;dex=1,cnt=0;
}
return 0;
}