实验7-1 两点间有路径吗? (20 分)

对于给定的无向图以及图中的两个顶点,计算两个顶点所在的连通分量中的顶点数,并且判断这两个顶点之间是否有路径。

输入格式:

第一行是不超过20的正整数N,表示图有N个顶点,顶点的编号即0~N-1

接下来N行,是N*N的邻接矩阵,矩阵的元素间用空格分隔;

最后一行是用空格隔开的两个顶点编号vw

输出格式:

第一行输出v所在的连通分量的顶点数

第二行输出w所在的连通分量的顶点数

第三行,若vw之间有路径,则输出Yes,否则输出No

注意:当vw是同一个顶点时,认为vw之间是有路径的。

输入样例:

对于这个图: 

fig.jpg

8
0 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0
1 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 1 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 3

输出样例:

5
2
No

用BFS或DFS进行遍历 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxVertexNum 20
typedef struct GNode* PtrToGNode;
struct GNode {
	int Nv;
	int G[MaxVertexNum][MaxVertexNum];
};
typedef PtrToGNode MGraph;
MGraph CreateGraph() {
	int v, w;
	int Nv;
	scanf("%d", &Nv);
	MGraph Graph = (MGraph)malloc(sizeof(struct GNode));
	Graph->Nv = Nv;
	for (v = 0; v < Nv; v++)
		for (w = 0; w < Nv; w++)
			scanf("%d", &Graph->G[v][w]);
	return Graph;
}
int Visited[MaxVertexNum];
/*void Visit(int v) {
	printf(" %d", v);
}*/
int count = 0;
/*void DFS(MGraph Graph, int v) {
	if (!Visited[v]) {
		int i;
		//Visit(v);
		Visited[v] = 1;
		count++;
		for (i = 0; i < Graph->Nv; i++) {
			if (!Visited[i] && Graph->G[v][i]) {
				DFS(Graph, i);
			}
		}
	}
}*/
void BFS(MGraph Graph, int v) {
	if (!Visited[v]) {
		int i;
		int front = 0, rear = 0;
		int Queue[MaxVertexNum];
		Queue[++rear] = v;
		Visited[v] = 1;
		while (rear != front) {
			int w;
			w = Queue[++front]; 
			//Visit(w);
			count++;
			for (i = 0; i < Graph->Nv; i++) {
				if (!Visited[i] && Graph->G[w][i]) {
					Queue[++rear] = i;
					Visited[i] = 1;
				}
			}
		}
	}
}
int main() {
	int v, w,temp;
	MGraph Graph = CreateGraph();
	scanf("%d%d", &v, &w);
		BFS(Graph, v);
	    //DFS(Graph, v);
		printf("%d\n", count);
		temp = count;
		count = 0;
		if (Visited[w]) {
			printf("%d\n", temp);
			printf("Yes");
		}
		else {
			BFS(Graph, w);
			//DFS(Graph, w);
			printf("%d\n", count);
			printf("No");
		}
	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值