【问题描述】
给定一个有向图,一共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;
}
本文章仅供学习和参考!
欢迎交流~