基于深度优先搜索的两顶点路径存在与否的判断

一个人想着一个人 提交于 2019-12-05 12:05:06
#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;
    }
}
void DFS(AGraph *G, int v)
{
    ArcNode *p;
    visit[v] = 1;                    //置标志位1代表已访问
    p = G->adjlist[v].firstarc;        //p指向顶点v的第一条边
    while (p)
    {
        if (visit[p->adjvex] == 0)    //未访问则递归访问
        {
            
            DFS(G, p->adjvex);
        }
        p = p->nextarc;
    }

}
//创建无向图的邻接表
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;

    }
}
//判断图两顶点间是否有路径
int trave(AGraph *G, char c,char d)
{
    int a = Locate(G, c);
    int b= Locate(G, d);
    for (int i = 0; i < G->n; ++i)
        visit[i] = 0;
    DFS(G,a);//两种遍历方式均可
    if (visit[b] == 1)
        return 1;
    else return 0;
}
AGraph *AG;
int main()
{
    int n, m;
    while (cin >> n >> m && n != 0 || m != 0)
    {
        AG = new AGraph;
        createAGraph2(AG,n,m);
        string a;
        cin >> a;//查询的两个顶点
        if (trave(AG, a[0], a[1]))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}
 
 

描述

 

设计一个算法,试基于深度优先搜索判断以邻接表方式存储的有向图中是否存在由顶点vi

 

输入

多组数据,每组m+3数据行。第一行有两个数字n和m,代表有n个顶点和m条边。第二行有n个字符,代表n个顶点的编号。第三行到第m+2行每行有两个字符h和k,代表边依附的两个顶点。第m+3行有两个字符vi和vj,代表需要判断的两个顶点。当n和m都等于0时,输入结束。

输出

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

输入样例 1 

3 2
abc
ab
bc
ac
4 2
bcsw
bs
sw
cs
0 0

输出样例 1

YES

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!