采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。

以邻接表存储的有向图中是否存在有顶点Vi到Vj顶点的路径(i!=j)。

问题描述:试基于图的深度优先搜索策略编写一程序,判别以邻接表存储的有向图中是否存在有顶点Vi到Vj顶点的路径(i!=j)。

输入:顶点个数,边数。顶点,边,要找的顶点i到j。

输出:若存在i到j路径,输出Exist the path,否则输出Not exist the path。

存储结构:邻接表存储结构。

算法基本思想:建立邻接表存储各顶点,边。然后深度优先搜索,用visited[i]作标志。

源程序:

#include "stdio.h"

#include "conio.h"

#define MAX_VERTEX_NUM 30

typedef struct ArcNode{

     int adjvex;

     struct ArcNode *nextarc;

}ArcNode;

typedef struct VNode{

     int data;

     ArcNode *firstarc;

}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct{

     AdjList vertices;

     int vexnum,arcnum;

}ALGraph;

creat_DG_ALGraph(ALGraph *G){

   int i,j,k;ArcNode *p;

   p=NULL;

   printf("Please input: vexnum ,arcnum=:");

   scanf("%d,%d",&G->vexnum,&G->arcnum);

   printf("Please input VNode:\n");

   for(i=0;i<G->vexnum;i++)

     {scanf("%d",&G->vertices[i].data);

      G->vertices[i].firstarc=NULL;

     }

   for(i=0;i<G->vexnum;i++)

     printf("%d ",G->vertices[i].data);

   printf("\n");

   for(k=0;k<G->arcnum;k++)

       {p=(ArcNode*)malloc(sizeof(ArcNode));

        printf("please input edge <i,j>: ");

        scanf("%d,%d", &i, &j);

        printf("\n");

        p->adjvex = j;

        p->nextarc=G->vertices[i].firstarc;

        G->vertices[i].firstarc=p;

       }

}

int exist_path_DFS(ALGraph G,int i,int j){

    ArcNode *p;

    int k,visited[MAX_VERTEX_NUM];

    p=NULL;

    if(i==j) return 1;

    else {visited[i]=1;

          for(p=G.vertices[i].firstarc;p;p=p->nextarc)

             {k=p->adjvex;

              if(!visited[k]&&exist_path_DFS(G,k,j));

             }

          }

}

main()

{ALGraph *G;

int i,j;

G=NULL;

creat_DG_ALGraph(G);

printf("Please input i->j you want to find:\n");

scanf("%d,%d",&i,&j);

if(exist_path_DFS(*G,i,j)) printf("Exist the path!");

else printf("Not exist the path");

getch();

}

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是采用深度优先搜索算法实现的判别无向图任意给定两个顶点之间是否存在一条长度为k的简单路径算法。其邻接表存储结构使用了结构体数组和链表。 ```c #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 // 最大顶点数 #define FALSE 0 #define TRUE 1 typedef struct ArcNode { // 邻接表边结点的类型 int adjvex; // 该边所指向的顶点的位置 struct ArcNode *nextarc; // 指向下一条边的指针 } ArcNode; typedef struct VertexNode { // 邻接表顶点结点的类型 int data; // 顶点信息 ArcNode *firstarc; // 指向第一条依附该顶点的边的指针 } VertexNode; typedef struct { // 邻接表的类型 VertexNode vertices[MAX_VERTEX_NUM]; // 顶点数组 int vexnum, arcnum; // 的当前顶点数和边数 } ALGraph; int visited[MAX_VERTEX_NUM]; // 访问标志数组 // 创建邻接表 void CreateALGraph(ALGraph *G) { int i, j, k; ArcNode *p; printf("请输入顶点数和边数(空格隔开):"); scanf("%d %d", &G->vexnum, &G->arcnum); for (i = 0; i < G->vexnum; ++i) { printf("请输入第%d个顶点信息:", i + 1); scanf("%d", &G->vertices[i].data); G->vertices[i].firstarc = NULL; } for (k = 0; k < G->arcnum; ++k) { printf("请输入边(vi,vj)的下标i和j及其边权值w(空格隔开):"); scanf("%d %d", &i, &j); p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = j; p->nextarc = G->vertices[i].firstarc; G->vertices[i].firstarc = p; p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = i; p->nextarc = G->vertices[j].firstarc; G->vertices[j].firstarc = p; } } // 深度优先搜索算法 int DFS(ALGraph *G, int v, int w, int k) { int flag = FALSE; if (k == 0) { // 到达目标深度 if (v == w) // 判断是否为目标顶点 flag = TRUE; } else { visited[v] = TRUE; // 将当前顶点标记为已访问 ArcNode *p = G->vertices[v].firstarc; while (p && !flag) { // 遍历当前顶点的所有邻接顶点 if (!visited[p->adjvex]) // 如果邻接顶点未被访问过 flag = DFS(G, p->adjvex, w, k - 1); p = p->nextarc; } visited[v] = FALSE; // 恢复当前顶点的未访问状态 } return flag; } // 判断无向图任意给定两个顶点之间是否存在一条长度为k的简单路径算法 int ExistSimplePath(ALGraph *G, int u, int v, int k) { int i; if (u < 0 || u >= G->vexnum || v < 0 || v >= G->vexnum) // 判断输入的顶点是否合法 return FALSE; if (k <= 0) // 判断输入的深度是否合法 return FALSE; for (i = 0; i < G->vexnum; ++i) visited[i] = FALSE; // 初始化访问标志数组 return DFS(G, u, v, k); // 判断是否存在一条长度为k的简单路径 } int main() { ALGraph G; CreateALGraph(&G); int u, v, k; printf("请输入要判断的两个顶点u和v以及路径长度k(空格隔开):"); scanf("%d %d %d", &u, &v, &k); if (ExistSimplePath(&G, u, v, k)) printf("存在一条长度为%d的简单路径顶点%d到顶点%d\n", k, u, v); else printf("不存在一条长度为%d的简单路径顶点%d到顶点%d\n", k, u, v); return 0; } ``` 在上述算法,先通过CreateALGraph函数建立无向图邻接表,然后在ExistSimplePath函数给定两个顶点u和v以及路径长度k进行判断。接着,在DFS函数实现了深度优先搜索算法,其visited数组用于标记顶点是否被访问过,p指针用于遍历当前顶点的所有邻接顶点。最后,根据DFS函数的返回结果,判断是否存在一条长度为k的简单路径

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值