• 基于邻接表的长度为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;
    }
  • 相关阅读:
    删除input上传的文件路径
    Atom的追踪函数插件和自定义语法
    配置虚拟域名,hosts文件起作用
    django--博客系统--后台管理
    django--个人主页建立练习
    django--博客--forms组件-用户注册
    django--之登录表单提交
    django--mysql设置
    django之中间件
    django之cookie与session
  • 原文地址:https://www.cnblogs.com/h694879357/p/11925826.html
Copyright © 2020-2023  润新知