求无向无权图任意两点存在的长度为len的路径

关于无向无权图任意两点存在的长度为len的路径?

  • 以如下无向无权图为例,求0到2之间长度为3的具体路径。

 

  • 以邻接表存储方式,初始化例图。

/**
 * 连接点结构
 */
typedef struct ArcNode{
    /**
     * 连接点的定点下标
     */
    int adjvex;
    /**
     * 下一个邻接点
     */
    struct ArcNode * nextarc;
    /**
     * 与此邻接点构成的边的信息
     */
    InfoType * info;
}ArcNode;

typedef struct VNode{
    /**
     * 定点信息
     */
    VertexType data;
    /**
     * 与其相连的第一个邻接点
     */
    ArcNode * firstarc;
}VNode, AdjList[MAX_VERTEX_NUM];

typedef struct ALGraph{
    /**
     * 图的顶点集
     */
    AdjList vertices;

    int vexnum, arcnum;
    /**
     * 图的种类
     */
    int kind;
}ALGraph;

/**
 * 构建初始化的例图
 * @return
 */
ALGraph * GetSampleGraph(){
    //...
    return alGraph;
}
  • 递归深度搜索是否存在从0到2是否存在长度为5的路径,如果存在则打印路径,如果不存在则继续深度搜索,核心代码如下
/**
 * 无向图从u到v路径长度为len的简单路径
 *
 */
int path[MAX_VERTEX_NUM];//记录路径信息
int pathlen = 0;//路径长度
int visited[MAX_VERTEX_NUM];//是否被访问过

/**
 * 打印路径
 * @param array 
 * @param len 
 */
void ShowArray(int *array, int len) {
    printf("\n");
    for (int i = 0; i < len; ++i) {
        printf(" %d ", array[i]);
    }
    printf("\n");
}


//出发点为i,终点为j,长度为k的路径
void TrailI2J4K(ALGraph *G, int i, int j, int k) {
    ArcNode *p;
    path[pathlen++] = i;
    if (i == j && k == 0)
        ShowArray(path, pathlen);
    else if (k > 0) {
        visited[i] = 1;
        for (p = G->vertices[i].firstarc; p; p = p->nextarc) {
            int temp = p->adjvex;
            if (!visited[temp]) {
                TrailI2J4K(G, temp, j, k - 1);
            }
        }
        visited[i] = 0;
        //这里需要把已经访问的点重新置为0,因为如果当前不存在长度为k
        //到达j点,那么这个点还是可以使用的,因为有可能从其他点出发
        //可以到达j点并且长度为k
    }
    pathlen--;
}
  • 可执行的代码如下:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#define VertexType int
#define MAX_VERTEX_NUM 50
#define InfoType int

typedef struct ArcNode {
    int adjvex;// vertex index
    struct ArcNode *nextarc;
    InfoType *info;
} ArcNode;

typedef struct VNode {
    VertexType data;
    ArcNode *firstarc;

} VNode, AdjList[MAX_VERTEX_NUM];

typedef struct ALGraph {
    AdjList vertices;
    int vexnum, arcnum;
    int kind;
} ALGraph;


ALGraph *GetSampleGraph() {
    ALGraph *alGraph = (ALGraph *) malloc(sizeof(ALGraph));
    alGraph->arcnum = 12;
    alGraph->vexnum = 7;
    alGraph->kind = 0;//无向无权图
    ArcNode *arc01 = (ArcNode *) malloc(sizeof(ArcNode));
    arc01->adjvex = 1;
    ArcNode *arc05 = (ArcNode *) malloc(sizeof(ArcNode));
    arc05->adjvex = 5;
    ArcNode *arc06 = (ArcNode *) malloc(sizeof(ArcNode));
    arc06->adjvex = 6;
    alGraph->vertices[0].firstarc = arc01;
    alGraph->vertices[0].firstarc->nextarc = arc05;
    alGraph->vertices[0].firstarc->nextarc->nextarc = arc06;
    alGraph->vertices[0].firstarc->nextarc->nextarc->nextarc = NULL;
    alGraph->vertices[0].data = 0;


    ArcNode *arc10 = (ArcNode *) malloc(sizeof(ArcNode));
    arc10->adjvex = 0;
    ArcNode *arc15 = (ArcNode *) malloc(sizeof(ArcNode));
    arc15->adjvex = 5;

    ArcNode *arc12 = (ArcNode *) malloc(sizeof(ArcNode));
    arc12->adjvex = 2;
    alGraph->vertices[1].data = 1;
    alGraph->vertices[1].firstarc = arc10;
    alGraph->vertices[1].firstarc->nextarc = arc15;
    alGraph->vertices[1].firstarc->nextarc->nextarc = arc12;
    alGraph->vertices[1].firstarc->nextarc->nextarc->nextarc = NULL;


    ArcNode *arc21 = (ArcNode *) malloc(sizeof(ArcNode));
    arc21->adjvex = 1;
    ArcNode *arc25 = (ArcNode *) malloc(sizeof(ArcNode));
    arc25->adjvex = 5;
    ArcNode *arc24 = (ArcNode *) malloc(sizeof(ArcNode));
    arc24->adjvex = 4;
    ArcNode *arc23 = (ArcNode *) malloc(sizeof(ArcNode));
    arc23->adjvex = 3;
    alGraph->vertices[2].data = 2;
    alGraph->vertices[2].firstarc = arc21;
    alGraph->vertices[2].firstarc->nextarc = arc25;
    alGraph->vertices[2].firstarc->nextarc->nextarc = arc24;
    alGraph->vertices[2].firstarc->nextarc->nextarc->nextarc = arc23;
    alGraph->vertices[2].firstarc->nextarc->nextarc->nextarc->nextarc = NULL;


    ArcNode *arc32 = (ArcNode *) malloc(sizeof(ArcNode));
    ArcNode *arc34 = (ArcNode *) malloc(sizeof(ArcNode));
    arc32->adjvex = 2;
    arc34->adjvex = 4;
    alGraph->vertices[3].data = 3;
    alGraph->vertices[3].firstarc = arc32;
    alGraph->vertices[3].firstarc->nextarc = arc34;
    alGraph->vertices[3].firstarc->nextarc->nextarc = NULL;

    ArcNode *arc42 = (ArcNode *) malloc(sizeof(ArcNode));
    ArcNode *arc43 = (ArcNode *) malloc(sizeof(ArcNode));
    ArcNode *arc45 = (ArcNode *) malloc(sizeof(ArcNode));
    ArcNode *arc46 = (ArcNode *) malloc(sizeof(ArcNode));
    arc42->adjvex = 2;
    arc43->adjvex = 3;
    arc45->adjvex = 5;
    arc46->adjvex = 6;
    alGraph->vertices[4].data = 4;

    alGraph->vertices[4].firstarc = arc42;
    alGraph->vertices[4].firstarc->nextarc = arc43;
    alGraph->vertices[4].firstarc->nextarc->nextarc = arc45;
    alGraph->vertices[4].firstarc->nextarc->nextarc->nextarc = arc46;
    alGraph->vertices[4].firstarc->nextarc->nextarc->nextarc->nextarc = NULL;

    ArcNode *arc50 = (ArcNode *) malloc(sizeof(ArcNode));
    ArcNode *arc51 = (ArcNode *) malloc(sizeof(ArcNode));
    ArcNode *arc52 = (ArcNode *) malloc(sizeof(ArcNode));
    ArcNode *arc54 = (ArcNode *) malloc(sizeof(ArcNode));
    ArcNode *arc56 = (ArcNode *) malloc(sizeof(ArcNode));
    arc50->adjvex = 0;
    arc51->adjvex = 1;
    arc52->adjvex = 2;
    arc54->adjvex = 4;
    arc56->adjvex = 6;
    alGraph->vertices[5].data = 5;
    alGraph->vertices[5].firstarc = arc50;
    alGraph->vertices[5].firstarc->nextarc = arc51;
    alGraph->vertices[5].firstarc->nextarc->nextarc = arc52;
    alGraph->vertices[5].firstarc->nextarc->nextarc->nextarc = arc54;
    alGraph->vertices[5].firstarc->nextarc->nextarc->nextarc->nextarc = arc56;
    alGraph->vertices[5].firstarc->nextarc->nextarc->nextarc->nextarc->nextarc = NULL;


    ArcNode *arc60 = (ArcNode *) malloc(sizeof(ArcNode));
    ArcNode *arc64 = (ArcNode *) malloc(sizeof(ArcNode));
    ArcNode *arc65 = (ArcNode *) malloc(sizeof(ArcNode));

    arc60->adjvex = 0;
    arc64->adjvex = 4;
    arc65->adjvex = 5;
    alGraph->vertices[6].data = 6;
    alGraph->vertices[6].firstarc = arc60;
    alGraph->vertices[6].firstarc->nextarc = arc64;
    alGraph->vertices[6].firstarc->nextarc->nextarc = arc65;
    alGraph->vertices[6].firstarc->nextarc->nextarc->nextarc = NULL;
    return alGraph;
}

/**
 * 无向图从u到v路径长度为len的简单路径
 *
 */
int path[MAX_VERTEX_NUM];//记录路径信息
int pathlen = 0;//路径长度
int visited[MAX_VERTEX_NUM];//是否被访问过

/**
 * 打印路径
 * @param array
 * @param len
 */
void ShowArray(int *array, int len) {
    printf("\n");
    for (int i = 0; i < len; ++i) {
        printf(" %d ", array[i]);
    }
    printf("\n");
}


//出发点为i,终点为j,长度为k的路径
void TrailI2J4K(ALGraph *G, int i, int j, int k) {
    ArcNode *p;
    path[pathlen++] = i;
    if (i == j && k == 0)
        ShowArray(path, pathlen);
    else if (k > 0) {
        visited[i] = 1;
        for (p = G->vertices[i].firstarc; p; p = p->nextarc) {
            int temp = p->adjvex;
            if (!visited[temp]) {
                TrailI2J4K(G, temp, j, k - 1);
            }
        }
        visited[i] = 0;
        //这里需要把已经访问的点重新置为0,因为如果当前不存在长度为k
        //到达j点,那么这个点还是可以使用的,因为有可能从其他点出发
        //可以到达j点并且长度为k
    }
    pathlen--;
}


int main() {

    ALGraph *alGraph = GetSampleGraph();
//    cout<<exist_path_len(alGraph,0,2,6)<<endl;
    TrailI2J4K(alGraph, 0, 2, 3);
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值