6-2 两顶点之前有路径吗?

6-2 两顶点之前有路径吗? (20 分)

对于给定的无向图及两个图中的顶点,请实现一个函数,分别打印包含这两个顶点的连通分量中的顶点数,并判断这两个顶点之间是否有路径。

函数接口定义:
int hasPath(struct Graph *g, int v, int w);
其中v和w是顶点
图定义如下:

#define MaxVertexNum 20   /* 最大顶点数 */
struct Graph{
    int v;    /*  顶点数量 */
    int Adj[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};

题目保证图至少有一个顶点
函数分别在第一行和第二行打印包含v和w的连通分量中顶点的数量。
如果 v和w之间有路径,函数返回1, 否则返回0.
提示:

你可以定义多个函数,也可以定义全局变量.
当v和w是同一个顶点时,认为v和w之间是有路径的。
裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 20   /* 最大顶点数设为20 */
struct Graph{
    int v;  // amount of vertices
    int Adj[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
int visited[MaxVertexNum]; /* 顶点的访问标记 */
struct Graph* CreateGraph(){
    int v;
    scanf("%d",&v);
    struct Graph* g;
    g = malloc(sizeof(struct Graph));
    if(!g) return NULL;
    g->v = v;
    for(int i=0; i<v; i++){
        visited[i] = 0;
        for(int j=0; j<v; j++)
            scanf("%d",&(g->Adj[i][j]));
    }
    return g;
}
int hasPath(struct Graph *g, int v, int w);
int main(){
    struct Graph* g;
    g = CreateGraph();
    int v,w;
    scanf("%d%d", &v, &w);
    printf("%s\n", hasPath(g,v,w) ? "Yes" : "No");
    return 0;
}
/* 你的代码将被嵌在这里 */

输入样例:
在这里插入图片描述

对于此图及样例测试程序规定的输入格式:

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
结尾无空行
Sample Output:
5
2
No
结尾无空行

C(gcc)

int F = 0;
int hasPath(struct Graph* g, int v, int w)
{
    int q[1000];
    int l = 0, r = 0, t;
    visited[v] = 1;
    q[r++] = v;
    while (l < r)
    {
        t = q[l++]; 
        if (t == w) { F = 1; break; }
        for (int i = 0; i < g->v; i++)
        {
            if (g->Adj[t][i] && visited[i] == 0)
            {
                q[r++] = i; visited[i] = 1;
            }
        }
    }
    travel(g, v);
    travel(g, w);
    return F;
}
void travel(struct Graph* g, int v)// BFS统计连通分量顶点个数
{
    for (int i = 0; i < g->v; i++)visited[i] = 0;//清空搜索记录
    int q[1000];
    int l = 0, r = 0, c = 0, t;
    visited[v] = 1;
    q[r++] = v;
    while (l < r)
    {
        t = q[l++]; c++;
        for (int i = 0; i < g->v; i++)
        {
            if (g->Adj[t][i] && visited[i] == 0)
            {
                q[r++] = i; visited[i] = 1;
            }
        }
    }
    printf("%d\n", c);
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
根据提供的信息,我们可以使用深度优先搜索(DFS)算法来判断顶点之间是否存在路径,并计算连通分量中的顶点数。 首先,我们需要构建无向图的邻接表表示。然后,我们可以使用DFS算法从一个顶点开始遍历图,并标记已访问的顶点。如果我们能够访问到目标顶点,则说明顶点之间存在路径。 以下是一个示例代码,演示了如何实现上述功能: ```python class Graph: def __init__(self, vertices): self.V = vertices self.adj = [[] for _ in range(vertices)] def addEdge(self, u, v): self.adj[u].append(v) self.adj[v].append(u) def DFS(self, v, visited): visited[v] = True count = 1 for i in self.adj[v]: if not visited[i]: count += self.DFS(i, visited) return count def isConnected(self, u, v): visited = [False] * self.V count_u = self.DFS(u, visited) count_v = self.DFS(v, visited) if count_u > 1 and count_v > 1: return True else: return False # 创建一个无向图 g = Graph(6) g.addEdge(0, 1) g.addEdge(0, 2) g.addEdge(1, 3) g.addEdge(2, 3) g.addEdge(2, 4) g.addEdge(3, 4) g.addEdge(4, 5) # 判断顶点之间是否存在路径,并计算连通分量中的顶点数 u = 0 v = 5 if g.isConnected(u, v): print("顶点之间存在路径") else: print("顶点之间不存在路径") ``` 在上述示例中,我们创建了一个包含6个顶点的无向图,并添加了边。然后,我们使用`isConnected`函数判断顶点0和顶点5之间是否存在路径,并打印相应的结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微__凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值