题目描述
假设有向图G采用邻接表存储,设计一个算法,判断图G是否是强连通图。若是则返回yes;否则返回no。(图中顶点信息为整型数据。)
输入
第一行为图中顶点的个数n;
第二行为图的边的条数e;
接下来e行,每行是一条边依附的两个顶点信息。
输出
强连通图输出yes,否则输出no.
样例输入
5
7
0 1
1 2
1 3
2 3
3 0
3 4
4 0
样例输出
yes
#include<stdio.h>
#include<string.h>
#define MaxSize 100
typedef struct node
{
int data[MaxSize];
int length;
struct node init(){length=0;}
}g;
g G[MaxSize];
bool flag;
int iNext,p;
//全局变量,iNext是邻接点,p是i的备份
bool judge(int i)
{
for(int j=0;j<G[i].length;j++)
{
iNext=G[i].data[j];
if(p==iNext)//如果绕回来了,则连通
{
flag=true;
break;
//退出循环,因为连通图是一个圈,会无限循环
}
judge(iNext);//递归邻接点
}
if(flag) return true;
else
return false;
}
int main()
{
int n,e,u,v;
scanf("%d",&n);
scanf("%d",&e);
for(int i=0;i<e;i++)
{
scanf("%d %d",&u,&v);
G[u].data[G[u].length++]=v;
}
int sum=0,p;
for(int i=0;i<n;i++)
{
iNext=-1;
p=i;
flag=false;
//表示judge函数中,图是否连通,一开始假定不连通
if(judge(i))sum++;
}
if(sum==n) printf("yes");
else printf("no");
}