鱼C论坛

 找回密码
 立即注册
楼主: 划句顾

[学习笔记] 图的遍历:深度和广度

[复制链接]
回帖奖励 8 鱼币 回复本帖可获得 2 鱼币奖励! 每人限 1 次(中奖概率 60%)
发表于 2021-12-7 20:40:24 | 显示全部楼层

回帖奖励 +2 鱼币

谢谢大佬,大佬真好!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-8 18:08:24 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-8 19:54:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-9 08:34:31 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-9 10:29:25 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-9 16:53:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-14 23:42:53 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-15 09:21:11 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-15 09:24:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-15 09:24:31 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-16 09:56:10 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-16 15:38:01 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-19 13:57:47 | 显示全部楼层
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAX 100     //最大顶点数
typedef struct BNode
{
    int pointPosite;             //该边所指向顶点的位置
    struct BNode *nextB;         //指向下一条边的指针
    int info;                             //和边相关的信息
}BNode;
typedef struct DNode
{
    string data;                   //存放顶点信息
    BNode *firstB;              //指针指向第一条依附该顶点的边
}DNode,AdjList[MAX];//AdjList表领接表类型``

typedef struct
{
    AdjList vertices;           //顶点向量
    int DNum, BNum;             //图的当前顶点数和边数
}TGraph;

typedef struct
{
    string *base;          //存储空间的基地址
    int front;                //头指针
    int rear;                //尾指针
}SqQueue;

void InitQueue(SqQueue &Q)
{//构造一个空队列
    Q.base = new string[MAX];       
    if(!Q.base)
    {
        cout<<"内存分配失败"<<endl;
    }
    Q.front = Q.rear = 0;
}
void EnQueue(SqQueue &Q, string e)
{
    if((Q.rear+1)%MAX == Q.front)
    {
        cout<<"队列已满"<<endl;
    }
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear+1)%MAX;
}
string DeQueue(SqQueue &Q, string &e)
{
    if(Q.front == Q.rear)
    {
        cout<<"队列为空"<<endl;
    }
    e = Q.base[Q.front];
    Q.front = (Q.front+1)%MAX;
    return e;
}
bool Empty(SqQueue Q)
{
    if(Q.front == Q.rear)
    {
        return true;
    }
    return false;
}

void CreateUDG(TGraph &G)       //无向图UDG
{
    string v1,v2;
    cout<<"请输入所要创建图的总顶点数和总边数:";
    cin>>G.DNum>>G.BNum;         //输入总顶点数和总边数
    for(int i = 0; i < G.DNum; ++i) //输入各点,构造表头结点表
    {
        cout<<"请输入第"<<i+1<<"个顶点的值:";
        cin>>G.vertices[i].data;    //输入顶点值
        G.vertices[i].firstB = NULL;//初始化表头结点指针域为空
    }
    for(int k = 0; k < G.BNum; ++k) //输入各边,构造领接表
    {
        BNode *p1,*p2;
        cout<<"请输入第"<<k+1<<"条边的信息:";
        cin>>v1>>v2;                //输入一条边依附的两个顶点
        int m = LocateVex(G, v1); int n = LocateVex(G, v2); //得到v1 v2在G.vertices中的序号
        p1 = new BNode;         //生成一个新的边结点*p1
        p1->pointPosite = n;    //邻接点序号为n
        p1->nextB = G.vertices[m].firstB;   //头插法
        G.vertices[m].firstB = p1;
        p2 = new BNode;
        p2->pointPosite = m;
        p2->nextB = G.vertices[n].firstB;
        G.vertices[n].firstB = p2;
    }
}

void UDGprint(TGraph G)
{
    BNode *p;
    for(int i = 0; i < G.DNum; ++i)
    {
        cout<<G.vertices[i].data;
        p = G.vertices[i].firstB;
        while(p)
        {
            cout<<"->";
            cout<<p->pointPosite;
            p = p->nextB;
        }
        cout<<endl;
    }
}


int LocateVex(TGraph G, string v)
{
    for(int i = 0; i < G.DNum; ++i)
    {
        if(v == G.vertices[i].data)
        {
            return i;
        }
    }
    return -1;
}

bool visited[MAX];

void deepTravel(TGraph G, string v)
{
    int b,w;
    BNode *p;
    cout<<v<<" ";
    b = LocateVex(G, v);
    visited[b] = true;  //访问第b个顶点,标志为true
    p = G.vertices[b].firstB;    //p指向v的边链表的第一个边结点
    while(p != NULL)            //如果p不为空
    {
        w = p->pointPosite;     //w为v的第一个边结点
        if(!visited[w])         //若w未被访问 则继续递归
        {
            string a;
            for(int i = 0; i < G.DNum; ++i)
            {
                if(w == i)
                {
                    a = G.vertices[i].data;
                }
            }
            deepTravel(G, a);
        }
        p = p->nextB;       //否则p指向下一个v的边结点
    }
}

void breadthTravel(TGraph G, string v)
{
    BNode *p;
    int l;
    string e;
    int b = LocateVex(G, v);
    SqQueue Q;
    InitQueue(Q);
    for(int i = 0; i < G.DNum; i++)
        visited[i] = false;
    if(!visited[b])
    {
        visited[b] = true;
        cout<<v<<" ";
        EnQueue(Q, v);
        while(!Empty(Q))
        {
            string s = DeQueue(Q, e);
            int u = LocateVex(G, s);
            p = G.vertices[u].firstB;
            while(p)
            {
                l = p->pointPosite;
                if(!visited[l])
                {
                    visited[l] = true;
                    cout<<G.vertices[l].data<<" ";
                    EnQueue(Q, G.vertices[l].data);
                }
                p = p -> nextB;
            }
        }
    }
}

int main()
{
    string ch;
    TGraph G;
    CreateUDG(G);
    cout<<"建立的邻接表如下: "<<endl;
    UDGprint(G);
    cout<<"请输入遍历开始的结点:";
    cin >> ch;
    cout<<"深度遍历序列为: ";
    deepTravel(G, ch);
    cout<<"\n广度遍历序列为: ";
    breadthTravel(G, ch);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-19 17:37:49 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-23 15:47:50 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-24 10:21:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-24 22:13:32 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-24 22:16:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-25 15:57:43 | 显示全部楼层

回帖奖励 +2 鱼币

nb
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-25 20:06:13 | 显示全部楼层
优秀啊,老板
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 23:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表