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


    #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
    
  • 相关阅读:
    CSS 会被继承的属性
    List的遍历和删除元素
    java中unicode和中文相互转换
    Hibernate注解方式一对多自关联关系映射
    HQL: Hibernate查询语言
    java replaceall 使用正则表达式替换单等号,不替换其他相关的等号。
    Java 将图片转二进制再将二进制转成图片
    返回上一页并刷新与返回不刷新代码
    Css圆角边框
    jquery mobile
  • 原文地址:https://www.cnblogs.com/h694879357/p/11923908.html
Copyright © 2020-2023  润新知