2021-11-07 连通 OR 不连通

【问题描述】

给定一个有向图,一共n个点,m条边,判断图中两个节点间是否连通。

 图的顶点个数n大于等于3,小于等于50,顶点值为字符型;顶点 序以字符序为顺序,相邻顶点序亦按照字符的次序为顺序。

【输入形式】

先从标准输入中输入图的顶点和边的个数,两整数之间以一个空格分隔

下一行输入所有顶点信息,顶点间以空格间隔

第三行始分行输入每条弧的信息,以空格间隔顶点。

最后的一行输入咨询的两顶点信息,顶点以空格间隔。

【输出形式】

   两节点间连通输出“yes”,不连通输出“no”

如下有向图:5个顶点6条边

【样例输入】

5 6

A B C D E

A B

A D

B C

D B

E A

E C

C A

【样例输出】

no

【样例说明】

第一行输入有向图有5个顶点,6条边,第二行输入5个顶点信息,第三至第八行输入6条边的信息,最后一行输入要求判断图中顶点C、A间是否连通。

C、A不连通,故输出结果为no。

【运行结果如下】

【代码如下】

#include<stdio.h> 
#define MVNum  50	//最大顶点个数  

//------图的的数组(邻接矩阵)存储表示------ 
typedef struct {
	char vexs[MVNum];		//顶点向量
	int	arcs[MVNum][MVNum];	//邻接矩阵
	int visited[MVNum];		//访问标志数组
	int	vexnum;				//顶点数
	int arcnum;		 		//弧数
}MGraph;
int LocateVex(MGraph G,char v)
{
	for (int i=0; i<G.vexnum; i++) 
		if (G.vexs[i] == v)	return i;
	return -1;
}
void CreateDG(MGraph &G)
{
	//构造有向图G 
	int i, j, k;
	char v1, v2; 
	scanf("%d %d",&G.vexnum,&G.arcnum);
	for (i=0; i<G.vexnum; i++){
		scanf(" %c",&G.vexs[i]);
		G.visited[i] = 0; 
	}
	for (i=0; i<G.vexnum; i++)
		for (j=0; j<G.vexnum; j++)	
			G.arcs[i][j] = 0;			
	for (k=0; k<G.arcnum; k++){
		scanf(" %c %c",&v1,&v2);
		i=LocateVex(G,v1);
		j=LocateVex(G,v2);
		G.arcs[i][j] = 1;
	}//for
}
void DFS(MGraph &G,int i) 
{
	//深度搜索
	G.visited[i] = 1;
	for (int j=0; j<G.vexnum; j++) 
		if (G.arcs[i][j]!=0 && !G.visited[j])
			DFS(G,j);		
}
void Judge(MGraph &G)
{
	//判断v1,v2是否连通
	char v1,v2;
	scanf(" %c %c",&v1,&v2);
	int i=LocateVex(G,v1);
	int j=LocateVex(G,v2);
	DFS(G,i);	//从v1位置开始深度遍历 
	if(G.visited[j] == 1)	//若v2被遍历过,则v1,v2连通 
		printf("yes");
	else
		printf("no");
}

int main()
{
	MGraph G; 
	CreateDG(G);
	Judge(G);
	return 0;
}

本文章仅供学习和参考!

欢迎交流~ 

Guess you like

Origin blog.csdn.net/m0_58489132/article/details/121191215