判断单向图是否为强连通图,除了用tarjan算法计算强连通分量外,还有一种比较好懂的算法,用dfs正向遍历,记录节点个数,并且记录每一次的尾节点,在反向从最后一次的尾节点dfs确定强连通图。
代码如下(以邻接表为例)
#include <bits/stdc++.h>
using namespace std;
int cnt;
int n,m;//n为节点数,m为道路数
int a[100][2];//存储邻接表
int log1[100][2];//记录走过
int flag1=0;记录尾节点
void dfs1(int k)
{
for(int i=0; i<m; i++)
{
if(a[i][0]==k&&log1[i][0]==0)
{
log1[i][0]=1;
cnt++;//记录遍历节点数
flag1=a[i][1];//更新尾节点
dfs1(a[i][1]);
}
}
}
int main()
{
while(cin>>n>>m&&m!=0&&n!=0)
{
int l=m;
while(l--)
{
cin>>a[l][0]>>a[l][1];
}
cnt=0;
dfs1(1);
if(cnt==n)//判断单向连通
{
cnt=0;
memset(log1,0,sizeof(log1));
dfs1(flag1);
if(cnt==n)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
else
cout<<"No"<<endl;
}
return 0;
}
当正向和反向遍历到的节点都为n时,该图为强连通图