暑期修炼第一天:英语50单词+线代行列式+深度广度优先

从今天起到2018/8/31,是属于我最后一段考研学习与编程修炼的时期!

今天没做好规划,效率不是很高,早上背了50个单词,数学从线代部分开始,看完行列式部分,并完成了例题。

晚上是属于编程的训练时间,可以学和写任何想写的代码:今天学习的是图论的深度优先和广度优先算法。两个算法都是基于邻接链表来实现的,语言是C++;

邻接链表数据结构:

const int MaxSize = 10;

// 邻接表(链式存储)
struct adjNode            //边表信息
{
    int end_node;        //邻接的顶点信息
    int weight;            //边的权重
    adjNode *next;        //指针,指向下一条边
};

struct VNode
{
    int name;            //顶点信息
    adjNode *next;        //指针,指向第一条边
};

// 邻接链表类
class GraphLinkedTable
{
public:
    VNode vertex[MaxSize];        //顶点链表
    int n;                        //顶点数
    int e;                        //边数
public:
    GraphLinkedTable();
    ~GraphLinkedTable();
    void insertEdge(int v1, int v2, int w);
    void buildGraph();
    void print();
};

深度优先算法:

主要用到递归来实现往深处走的逻辑,与二叉树的先序遍历相似。

/*
* 深度优先算法
*/
void DFS(GraphLinkedTable G, int v)
{
    Visit(v);    //访问初始点,并标记

    adjNode *p;
    p = G.vertex[v].next;    //找下一个点
    while (p != NULL)
    {
        if (visited[p->end_node] == 0)    //若结点未访问
            DFS(G, p->end_node);        //递归调用DFS,往深处走
        p = p->next;                //回溯的时候,推动算法的进程
    }
}

广度优先算法

主要用到队列来记录结点访问顺序,利用邻接链表的特性,实现层次遍历。

/*
* 广度优先算法
*/
void BFS(GraphLinkedTable G, int v)
{
    adjNode *p;
    int que[MaxSize], front = 0, rear = 0;    //用到队列,用于记录结点访问顺序
    int out;

    Visit(v);    //访问初始点
    rear = (rear + 1) % MaxSize;
    que[rear] = v;    //将初始点加入队列

    while (front != rear)
    {
        front = (front + 1) % MaxSize;
        out = que[front];    //出队操作
        p = G.vertex[out].next;    //取到出队点的下一个点

        while (p != NULL)
        {
            if (visited[p->end_node] == 0)            //若结点未访问
            {
                Visit(p->end_node);                    //访问该节点
                rear = (rear + 1) % MaxSize;    
                que[rear] = p->end_node;            //将该节点加入队列
            }
            p = p->next;                        //根据邻接链表的特点,指针往下走就是在执行广度优先
        }
    }
    
}

今晚制定一下学习计划,虽说计划时用来打乱的,但是总要有个目标,学起来才用动力呀!这个暑假,好好沉淀自己!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值