当前位置: 首页 > article >正文

[数据结构]无向图的深度优先非递归遍历

采用邻接表存储实现无向图的深度优先非递归遍历。

输入格式:

先输入两个整数(m,n)(分别表示待创建的图顶点数和边数),之后是m个顶点的信息,再之后是n 条边。

输出格式:

对每一组输入,在一行中输出该无向图的深度遍历结果,各个数据之间用一个空格分隔,最后一个数据后也有空格。

输入样例:

在这里给出一组输入。例如:

6 6
a b c d e f
a b
a c
a d
b e
b f
d e

输出样例:

在这里给出相应的输出。例如:

a d e b f c 

 

#include <bits/stdc++.h>
#define MVNum 100
using namespace std;
bool visited[MVNum];
typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *nextarc;
    
}ArcNode;
typedef struct VNode
{
    char data;
    ArcNode *firstarc;
}VNode,AdjList[MVNum];
typedef struct
{
    AdjList vertices;
    int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph &G,char v)
{
    int flag=0;
    for(int i=0;i<G.vexnum;i++)
    {
        if(G.vertices[i].data==v)
        {
            flag=1;return i;
        }
    }
}
int CreateDG(ALGraph &G)
{
    char v1,v2;
    cin>>G.vexnum>>G.arcnum;
    for(int i=0;i<G.vexnum;i++)
    {
        cin>>G.vertices[i].data;
        G.vertices[i].firstarc=NULL;
    }
    for(int i=0;i<G.arcnum;i++)
    {
        cin>>v1>>v2;
        int t1=LocateVex(G,v1);
        int t2=LocateVex(G,v2);
        ArcNode *p1,*p2;
        p1=new ArcNode;
        p1->adjvex=t2;
        p1->nextarc=G.vertices[t1].firstarc;
        G.vertices[t1].firstarc=p1;
        p2=new ArcNode;
        p2->adjvex=t1;
        p2->nextarc=G.vertices[t2].firstarc;
        G.vertices[t2].firstarc=p2;
    }
    return 1;
}

void DFS(ALGraph G,int vi)
{
    ArcNode* st[100];int top=-1;int v;
    ArcNode*p;
    cout<<G.vertices[vi].data<<" ";
    visited[vi]=true;
    top++;
    st[top]=G.vertices[vi].firstarc;
    while(top>-1)
    {
        p=st[top];
        while(p!=NULL)
        {
            v=p->adjvex;
            if(visited[v]==false)
            {
                cout<<G.vertices[v].data<<" ";
                visited[v]=true;
                top++;st[top]=G.vertices[v].firstarc;
                break;
            }
            p=p->nextarc;
        }
        if(p==NULL)top--;
    }
}
void DFSbianli(ALGraph G)
{
    for(int i=0;i<G.vexnum;i++)
    {
        visited[i]=false;
    }
    for(int i=0;i<G.vexnum;i++)
        if(!visited[i])DFS(G,i);
}
void PrintG(ALGraph &G)
{
    ArcNode *p;
    for(int i=0;i<G.vexnum;i++)
    {
        cout<<G.vertices[i].data<<":";
        p=G.vertices[i].firstarc;
        while(p!=NULL)
        {
            cout<<p->adjvex+1<<" ";
            p=p->nextarc;
        }
        cout<<endl;
     }
}
int main()
{
    ALGraph G;
    CreateDG(G);
    //PrintG(G);
    DFSbianli(G);
}


http://www.kler.cn/a/441402.html

相关文章:

  • Electron学习笔记,安装环境(1)
  • Final2x--开源AI图片放大工具
  • Linux-day10
  • 二叉树的深度
  • Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴
  • mysql从全备文件中提取单库或单表进行恢复——筑梦之路
  • Python中cv2 (OpenCV, opencv-python)库的安装、使用方法demo最新详细教程
  • TGA历年最佳年度游戏
  • 靜態IP與DHCP的區別和用法
  • 基于springboot+vue实现的北部湾地区助农平台 (源码+L文+ppt)4-119
  • 网络隧道与代理
  • 医学统计软件的选择:SPSS与R语言的深度对比
  • 高并发-缓存预热
  • JavaScript期末复习日记1——基本语法操作01
  • Java开源位图(Bitmap)工具库和框架
  • vscode的copilot提示e.replace is not a function
  • Amazon Bedrock与AWS服务的无缝集成,如何打造智能化应用
  • 约瑟夫环四种解法(数组,链表,递归,数学归纳)C/C++
  • 【学习笔记】桌面浏览器的视口
  • 【mysql】大型互联网项目为什么考虑禁止使用外键
  • 中阳科技:量化模型驱动的智能交易革命
  • DATA-HUB 安装与启动:
  • 静态路由、RIP、OSPF、BGP的区别
  • Qt 实现 UDP 广播的详细教程
  • 部署WordPress6.7.1版本(官网最新版本)
  • C# 机器视觉-RANSAC算法拟合圆