图顶点间的简单路径(深度遍历)

本文介绍了一种基于链表实现的图结构,并通过深度优先搜索(DFS)算法来查找两个顶点之间的简单路径。文章详细展示了图的创建过程及DFS遍历算法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图结构
文件Graph.h

#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#include <iostream>
#include <cstdlib>

using namespace std;
//链表结构
typedef struct ListNode {
    int index;
    struct ListNode *next;
}ListNode;
//顶点结构
typedef struct Vertex{
    ListNode *firstvex;
    char data;
}Vertex;
//图结构
typedef struct Graph{
    Vertex vertex[256];
    int vexnum , edgenum;
}Graph;

void Init(Graph &G);
void Create_Graph(Graph &G);
void DFSTraverse(Graph G , char x , char y);
void DFS(Graph G , int index , char y);

void Init(Graph &G){
    G.edgenum = 0;
    G.vexnum = 0;
}

void Create_Graph(Graph &G){
    cout << "请输入顶点数:" ;
    cin >> G.vexnum;
    cout << "请输入边数:";
    cin >> G.edgenum;
    int i , j , k;
    //第0号位置不用,输入顶点
    for (i = 1 ; i <= G.vexnum ; i++){
        cout << "第" << i << "个顶点为:";
        cin >> G.vertex[i].data;
        G.vertex[i].firstvex = NULL;
    }
    //输入边
    for(int k = 0 ; k < G.edgenum ; k++){
        cout << "请输入边(vi , vj)的下标i,j:";
        cin >> i >> j;
         //构造边即将顶点下标存入链结构中
         //前插法,尾插法需要遍历好麻烦
         ListNode *e = new ListNode;
         e->index = j;
         e->next = G.vertex[i].firstvex;
         G.vertex[i].firstvex = e;

         e = new ListNode;
         e->index = i;
         e->next = G.vertex[j].firstvex;
         G.vertex[j].firstvex = e;
    }
}
//是否访问的标志
int visited[256];
//用于存放途径的点
char str[128];
//给str用的
int pos = 0;

void DFSTraverse(Graph G , char x , char y){
    int i;
    //第0个位置不用,置零代表未访问
    for(i = 1 ; i <= G.vexnum ; i++){
        visited[i] = 0;
    }
    //用于存放起点的下标
    int index;
    for(i = 1 ; i <= G.vexnum ; i++){
        if(G.vertex[i].data == x){
            index = i;
            break;
        }
    }

    DFS(G , index , y);
}


void DFS(Graph G , int index , char y){
    visited[index] = 1;
    //将起点放入str
    str[pos++] = G.vertex[index].data;
    //w指向顶点相邻的第一个元素
    ListNode *w = G.vertex[index].firstvex;
    while(w)
    {
        if(visited[w->index] == 0)
        {
            //如果找到了终点就输出打印str
            if(G.vertex[w->index].data == y){
                str[pos++] = y;
                cout << str << endl;
                //程序停止不然会递归回溯
                exit(0);
            }
            //递归遍历相邻点的一个相邻点
            //一直往下找,一条路走到黑
            DFS(G , w->index , y) ;
        }
        //已经被访问过了就访问顶点的下一个相邻点
        w = w->next ;
    }
    //如果一条路径找到最后都没找到终点就将顶点从
    //str中删除
    if(G.vertex[w->index].data != y){
        str[--pos] = '\0';
    }
}

void SimplePath(Graph G){
    char x , y;
    cout << "请输入你需要查找简单路径的两顶点:";
    cin >> x >> y;
    DFSTraverse(G , x , y);
}

#endif // GRAPH_H_INCLUDED

文件main.cpp

#include <iostream>
#include "Graph.h"

using namespace std;
int main()
{
    Graph G;
    Init(G);
    Create_Graph(G);
    SimplePath(G);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值