深度优先搜索判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)

数据结构文章推荐:
👉 顺序表和链表实现图书管理系统
👉 指针如何赋值?关于指针的理解
👉 多种方式实现英文单词词频统计和检索系统
👉 待更新
内容要求:

试基于图的深度优先搜索策略写一个算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。并请设计程序测试该算法的有效性。

代码实现(仅供参考):
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100  //最大边数
typedef struct ArcNode{//弧结点
    int ajdVex;    //弧终点指针位置
    ArcNode* next;     //下一条弧的指针
};
typedef struct Node{//顶点结点
    ArcNode* Arc;     //指向依附该顶点的弧指针
};
typedef struct Graph{//邻接表
    Node adjlist[MAXN];     //点集
    bool visited[MAXN];     //是否被遍历
    int n,m;    //顶点数和弧数
};
    Graph *G = (Graph*)malloc(sizeof(Graph));
    int i,j,k;bool hasPath = false;
void createLink(){//创建邻接表
    printf("请输入顶点数n 弧数m:");
    scanf("%d %d",&G->n,&G->m);
    printf("创建的所有点:");
    for(i=0;i<G->n;i++){ G->adjlist[i].Arc = 0;printf("V%d ",i);}printf("\n");
    for(j=0;j<G->m;j++){
        printf("第%d条弧起点编号、终点编号:",j+1);
        scanf("%d %d",&i,&k);
        ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
        p->ajdVex = k;  //将边所指向的点编号赋值
        p->next = G->adjlist[i].Arc;
        G->adjlist[i].Arc = p;
    }
}
void print_Graph(){//输出邻接表
    ArcNode *p;
    for(i=0;i<G->n;i++){
        p = G->adjlist[i].Arc;
        printf("V%d",i);
        while(p){
            printf("->V%d",p->ajdVex);
            p = p->next;
        }printf("\n");
    }
}
void existPath(int d,int z){//两点是否连通
    G->visited[d] = true;
    ArcNode *p = G->adjlist[d].Arc;
    if(d == z)hasPath = true;
    while(p){
        if(p->ajdVex==z)hasPath = true;
        if(!G->visited[p->ajdVex])existPath(p->ajdVex,z);
        p = p->next;
    }
}
void print_Path(int d,int z){//输出两点连接路径
    ArcNode *p = G->adjlist[d].Arc;
    printf("路径为:V%d",d);
    while(p){
        printf("->V%d",p->ajdVex);
        if(p->ajdVex == z)break;
        p = G->adjlist[p->ajdVex].Arc;
    }printf("\n");
}
void setFlase(){//visited置零
    hasPath = false;
    for(i=0;i<G->n;i++) G->visited[i] = false;
}
int main(){
    createLink();
    while(true){printf("\n");
        printf("请输入操作(1.打印信息 2.判断路径 3.退出):");
        int choice; scanf("%d",&choice);setFlase();
        if(choice == 1) print_Graph();
        if(choice == 2){
            printf("请输入两点编号:"); scanf("%d %d",&i,&k);existPath(i,k);
            if(hasPath){printf("两点连通!\n");print_Path(i,k);} 
            else printf("两点不连通!\n");
        }
        if(choice == 3)break;
    }
    return 0;
}
实现效果:效果图

这个问题专门考察了我们对深度优先搜索的使用熟练程度,同时也加深了我们对图的操作。
最后,如果有问题的话欢迎交流!有帮助的话别忘了支持一下哦 👍👍👍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hillain

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

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

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

打赏作者

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

抵扣说明:

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

余额充值