基于邻接表的长度为k的简单路径的求解

Posted h694879357

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于邻接表的长度为k的简单路径的求解相关的知识,希望对你有一定的参考价值。

描述

 

一个连通图采用邻接表作为存储结构。设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径。

 

输入

多组数据,每组m+3数据行。第一行有两个数字n,m和k,代表有n个顶点,m条边和长度k。第二行有n个字符,代表n个顶点的编号。第三行到第m+2行每行有两个字符h和p,代表边依附的两个顶点。每条边的长度为1。第m+3行有两个字符d和f,代表需要判断的两个字符。

输出

每组数据输出一行。若存在路径输出“YES”,反之输出“NO”。

输入样例 1 

3 2 2
abc
ab
bc
ac
4 2 5
bcsw
bs
sw
bw
0 0 0

输出样例 1

YES
NO
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
#define MaxSize 100
using namespace std;
typedef struct ArcNode
{
    int adjvex;                 //该边所指向的结点的位置(也就是编号)
    struct ArcNode *nextarc;    //指向下一条边的指针
    int info;                   //
}ArcNode;

typedef struct
{
    char data;                  //顶点信息
    ArcNode *firstarc;          //指向第一条边的指针
}VNode;
typedef struct
{
    VNode adjlist[MaxSize];
    int n, e;                    //顶点数、边数
}AGraph;                        //图的邻接表类型
int visit[MaxSize];
int Locate(AGraph *AG, char c)
{
    for (int i = 0; i < AG->n; i++)
    {
        if (AG->adjlist[i].data == c)
            return i;
    }
}
int nodenum = 0;
bool DFS(AGraph *G, int v,int w,int k)
{
    ArcNode *p;
    visit[v] = ++nodenum;
    if (v == w && k == 0)//置标志位1代表已访问
        return true;
    else
        if (k > 0)
        {
            p = G->adjlist[v].firstarc;
            while (p)
            {
                if (visit[p->adjvex] == 0&&DFS(G,p->adjvex,w,k-1))
                {
                    return true;
                }
                visit[p->adjvex] = 0;
                nodenum--;
                p = p->nextarc;
            }
            
        }
    return false;
}
//创建无向图的邻接表
void createAGraph2(AGraph *&AG, int t, int p)
{
    int i, j, k;
    ArcNode *q;
    AG->n = t;
    AG->e = p;
    string b;
    cin >> b;
    for (i = 0; i < AG->n; i++)
    {
        AG->adjlist[i].data = b[i];
        AG->adjlist[i].firstarc = NULL;
    }
    string cc;
    for (k = 0; k < AG->e; ++k)
    {
        cin >> cc;
        //头插法
        i = Locate(AG, cc[0]);
        j = Locate(AG, cc[1]);
        q = new ArcNode;
        q->adjvex = j;
        q->nextarc = AG->adjlist[i].firstarc;
        AG->adjlist[i].firstarc = q;
            
        q = new ArcNode;
        q->adjvex = i;
        q->nextarc = AG->adjlist[j].firstarc;
        AG->adjlist[j].firstarc = q;

    }
}

AGraph *AG;
int main()
{
    int n, m,k;
    while (cin >> n >> m >>k&& k!=0||n != 0 || m != 0)
    {
        AG = new AGraph;
        createAGraph2(AG, n, m);
        string a;
        cin >> a;//查询的两个顶点
        
        if (DFS(AG, Locate(AG,a[0]),Locate(AG, a[1]),k))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

 

以上是关于基于邻接表的长度为k的简单路径的求解的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版) 图 算法设计Demo5

基于邻接表的深度优先遍历 (非递归)

Floyd求解最短路

基于邻接表的拓扑排序实现

关于邻接矩阵的拆点 和一些杂七杂八想不到的做法

P3758 [TJOI2017]可乐