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

本科自考有哪些科目河南seo网站多少钱

本科自考有哪些科目,河南seo网站多少钱,低价网站设计,大气简约企业网站模板免费下载408答疑 文章目录 五、图的代码实操图的存储邻接矩阵结构定义初始化插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点显示图 邻接表结构定义初始化图插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点…

408答疑


文章目录

  • 五、图的代码实操
    • 图的存储
      • 邻接矩阵
        • 结构定义
        • 初始化
        • 插入顶点
        • 获取顶点位置
        • 在顶点 v1 和 v2 之间插入边
        • 获取第一个邻接顶点
        • 获取下一个邻接顶点
        • 显示图
      • 邻接表
        • 结构定义
        • 初始化图
        • 插入顶点
        • 获取顶点位置
        • 在顶点 v1 和 v2 之间插入边
        • 获取第一个邻接顶点
        • 获取下一个邻接顶点
        • 显示图
    • 图的遍历
      • 深度优先遍历
        • 算法思想
          • 算法步骤
          • 算法特点
        • 邻接矩阵
        • 邻接表
      • 广度优先遍历
        • 算法思想
        • 邻接矩阵
        • 邻接表
    • 图的应用
      • BFS算法求解单源最短路径问题
      • 拓扑排序
  • 六、参考资料
    • 鲍鱼科技课件
    • 26王道考研书


五、图的代码实操

图的存储

邻接矩阵

结构定义
typedef struct GraphMtx {int numV; // 顶点个数int numE; // 边的条数ElemType vList[MAX_VERTEX_SIZE]; // 顶点空间int edge[MAX_VERTEX_SIZE][MAX_VERTEX_SIZE]; // 边的矩阵
} GraphMtx;
初始化
  • 初始化图的顶点数和边数为 0,并将邻接矩阵的所有元素设置为 0。
void initGraph(GraphMtx *g) {g->numV = 0;g->numE = 0;for (int i = 0; i < MAX_VERTEX_SIZE; ++i) {for (int j = 0; j < MAX_VERTEX_SIZE; ++j)g->edge[i][j] = 0;}
}
插入顶点
  • 在图中插入一个新顶点,如果顶点数超过最大值则不插入。
void insertVertex(GraphMtx *g, ElemType vertex) {if (g->numV >= MAX_VERTEX_SIZE)return;g->vList[g->numV] = vertex;g->numV++;
}
获取顶点位置
  • 返回顶点在顶点列表中的位置,如果不存在则返回 -1。
int getPosVertex(GraphMtx *g, ElemType vertex) {for (int i = 0; i < g->numV; ++i) {if (g->vList[i] == vertex)return i;}return -1; // 没有要查找的顶点
}
在顶点 v1 和 v2 之间插入边
  • 在图中插入一条从顶点 vertex1 到顶点 vertex2 的边。
void insertEdge(GraphMtx *g, ElemType vertex1, ElemType vertex2) {int v1 = getPosVertex(g, vertex1);int v2 = getPosVertex(g, vertex2);// 插入v1->v2边g->edge[v1][v2] = 1;// 若是无向图,则插入v2->v1边//g->edge[v2][v1] = 1;g->numE++;
}
获取第一个邻接顶点
  • 获取给定顶点的第一个邻接顶点。
int getFirstNeighbor(GraphMtx *g, ElemType vertex) {int v = getPosVertex(g, vertex);if (v == -1)return -1; // 没有邻接顶点for (int j = 0; j < g->numV; ++j) {if (g->edge[v][j] == 1)return j; // 返回邻接顶点}return -1; // 没有邻接顶点
}
获取下一个邻接顶点
  • 获取给定顶点的下一个邻接顶点。
int getNextNeighbor(GraphMtx *g, ElemType vertex1, ElemType vertex2) {int v1 = getPosVertex(g, vertex1);int v2 = getPosVertex(g, vertex2);if (v1 == -1 || v2 == -1)return -1;for (int j = v2 + 1; j < g->numV; ++j) {if (g->edge[v1][j] == 1)return j;}return -1;
}
显示图
  • 显示图的邻接矩阵。
void showGraph(GraphMtx *g) {printf(" ");for (int i = 0; i < g->numV; ++i)printf(" %c", g->vList[i]);printf("\n");for (int i = 0; i < g->numV; ++i) {printf("%c ", g->vList[i]);for (int j = 0; j < g->numV; ++j) {printf("%d ", g->edge[i][j]);}printf("\n");}
}

邻接表

结构定义
typedef struct Edge {int dest; // 目标顶点的下标struct Edge *next; // 结点指针
} Edge;typedef struct Vertex {ElemType data;   // 顶点数据Edge *first; // 指向边的起始指针
} Vertex;typedef struct GraphLnk {int numV; // 顶点数int numE; // 边的条数Vertex nodeTable[MAX_VERTEX_SIZE];
} GraphLnk;
初始化图
  • 初始化图的顶点数和边数为 0,并将邻接表的所有元素设置为 NULL。
void initGraph(GraphLnk *g) {g->numV = 0;g->numE = 0;for (int i = 0; i < MAX_VERTEX_SIZE; ++i)g->nodeTable[i].first = NULL;
}
插入顶点
  • 在图中插入一个新顶点,如果顶点数超过最大值则不插入。
void insertVertex(GraphLnk *g, ElemType vertex) {if (g->numV >= MAX_VERTEX_SIZE)return;g->nodeTable[g->numV].data = vertex;g->numV++;
}
获取顶点位置
  • 返回顶点在顶点列表中的位置,如果不存在则返回 -1。
int getPosVertex(GraphLnk *g, ElemType vertex) {for (int i = 0; i < g->numV; ++i) {if (g->nodeTable[i].data == vertex)return i;}return -1; // 没有要查找的顶点
}
在顶点 v1 和 v2 之间插入边
  • 在图中插入一条从顶点 vertex1 到顶点 vertex2 的边。
void insertEdge(GraphLnk *g, ElemType vertex1, ElemType vertex2) {int v1 = getPosVertex(g, vertex1);int v2 = getPosVertex(g, vertex2);// v1->v2Edge *e = (Edge*)malloc(sizeof(Edge));e->dest = v2;e->next = g->nodeTable[v1].first;g->nodeTable[v1].first = e;// 	若是无向图,则插入v2->v1边//e = (Edge*)malloc(sizeof(Edge));//e->dest = v1;//e->next = g->nodeTable[v2].first;//g->nodeTable[v2].first = e;g->numE++;
}
获取第一个邻接顶点
  • 获取给定顶点的第一个邻接顶点。
int getFirstNeighbor(GraphLnk *g, ElemType vertex) {int v = getPosVertex(g, vertex);if (v == -1)return -1; // 没有邻接顶点if (g->nodeTable[v].first != NULL)return g->nodeTable[v].first->dest;return -1; // 没有邻接顶点
}
获取下一个邻接顶点
  • 获取给定顶点的下一个邻接顶点。
int getNextNeighbor(GraphLnk *g, ElemType vertex1, ElemType vertex2) {int v1 = getPosVertex(g, vertex1);int v2 = getPosVertex(g, vertex2);if (v1 == -1 || v2 == -1)return -1;Edge *p = g->nodeTable[v1].first;while (p->dest != v2)p = p->next;p = p->next;if (p != NULL)return p->dest;return -1;
}
显示图
  • 显示图的邻接表。
void showGraph(GraphLnk *g) {for (int i = 0; i < g->numV; ++i) {printf("%d %c : ", i, g->nodeTable[i].data);Edge *p = g->nodeTable[i].first;while (p != NULL) {printf("%d->", p->dest);p = p->next;}printf("Nil.\n");}
}

图的遍历

深度优先遍历

算法思想

深度优先遍历(DFS)是一种用于遍历或搜索图或树的算法。该算法使用栈(显式或递归)来实现非递归约的遍历过程。算法从图中的某一顶点开始,沿着路径深入访问尽可能远的顶点,直到不能再深入为止,然后回溯并访问其他路径。

算法步骤
  1. 访问起始顶点:选择图中的某一顶点作为起始点,并标记为已访问。
  2. 访问邻接顶点:访问该顶点的所有未被访问的邻接顶点,对每个邻接顶点递归地调用DFS。
  3. 回溯:当当前路径无法继续深入时,回溯到最近的已访问顶点,检查是否有其他未访问的邻接顶点。
  4. 重复过程:重复上述过程,直到图中所有顶点都被访问。
算法特点
  • DFS 相当于二叉树中的前序遍历。
  • 使用临时空间来标记结点是否被访问过。
  • 适用于图的连通性检测、拓扑排序等场景。
邻接矩阵
void DFS(GraphMtx *g, ElemType vertex) {printf("%c->", vertex);int v = getPosVertex(g, vertex);visit[v] = 1; // 标记顶点int w = getFirstNeighbor(g, vertex);while (w != -1) {if (!visit[w]) {DFS(g, g->vList[w]);}w = getNextNeighbor(g, g->vList[v], g->vList[w]); //(g, v1, v2)}
}
邻接表
void DFS(GraphLnk *g, ElemType vertex) {printf("%c->", vertex);int v = getPosVertex(g, vertex);visit[v] = 1; // 标记顶点int w = getFirstNeighbor(g, vertex);while (w != -1) {if (!visit[w]) {DFS(g, g->nodeTable[w].data);}w = getNextNeighbor(g, g->nodeTable[v].data, g->nodeTable[w].data); //(g, v1, v2)}
}

广度优先遍历

算法思想
  1. 初始化

    • 标记起始顶点为已访问。
    • 将起始顶点入队。
  2. 遍历队列:当队列不为空时,执行以下操作。

    • 从队列中取出一个顶点。
    • 访问该顶点的所有未访问过的邻接顶点。
    • 将这些邻接顶点标记为已访问,并加入队列。
  3. 重复步骤2,直到队列为空,即所有可达顶点都被访问。

邻接矩阵
void BFS(GraphMtx *g, ElemType vertex) {printf("%c->", vertex);int v = getPosVertex(g, vertex);visit[v] = 1;int Q[MAX_VERTEX_SIZE];int front = 0, rear = 0;// 入队Q[rear++] = v;while (front != rear) { // 队列不空v = Q[front++]; // 出队并保存顶点int w = getFirstNeighbor(g, g->vList[v]);while (w != -1) {if (!visit[w]) {printf("%c->", g->vList[w]);visit[w] = 1;Q[rear++] = w;}w = getNextNeighbor(g, g->vList[v], g->vList[w]);}}
}
邻接表
void BFS(GraphLnk *g, ElemType vertex) {printf("%c->", vertex);int v = getPosVertex(g, vertex);visit[v] = 1;int Q[MAX_VERTEX_SIZE];int front = 0, rear = 0;// 入队Q[rear++] = v;while (front != rear) { // 队列不空v = Q[front++]; // 出队并保存顶点int w = getFirstNeighbor(g, g->nodeTable[v].data);while (w != -1) {if (!visit[w]) {printf("%c->", g->nodeTable[w].data);visit[w] = 1;Q[rear++] = w;}w = getNextNeighbor(g, g->nodeTable[v].data, g->nodeTable[w].data);}}
}

图的应用

BFS算法求解单源最短路径问题

  1. 初始化

    • 设置所有顶点的最短路径长度为无穷大,起始顶点的距离为0。
    • 标记起始顶点为已访问。
    • 将起始顶点加入队列。
  2. BFS遍历:当队列非空时,执行以下操作。

    • 从队列中取出一个顶点。
    • 遍历该顶点的所有未访问邻接顶点。
    • 更新邻接顶点的最短路径长度。
    • 标记邻接顶点为已访问。
    • 将邻接顶点加入队列。
  3. 完成遍历

    • 重复步骤2,直到队列为空。
    • 此时,数组d中存储的即为从起始顶点到所有可达顶点的最短路径长度。
void BFS_MIN_Distance(GraphMtx G, int u) {// d[i]表示从u到i结点的最短路径长度int d[MAX_VERTEX_SIZE]; int visited[MAX_VERTEX_SIZE]; // 访问标记数组Queue Q; // 定义队列Qfor (int i = 0; i < G.numV; ++i) {d[i] =; // 初始化路径长度为无穷大visited[i] = FALSE; // 初始化所有顶点为未访问}d[u] = 0; // 起始顶点到自身的距离为0visited[u] = TRUE; // 标记起始顶点为已访问EnQueue(Q, u); // 将起始顶点入队while (!IsEmpty(Q)) { // BFS算法主过程int v;DeQueue(Q, v); // 队头元素v出队for (int w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w)) {if (!visited[w]) { // w为v的尚未访问的邻接顶点visited[w] = TRUE; // 标记为已访问d[w] = d[v] + G.edge[v][w]; // 路径长度加v到w的边的权重EnQueue(Q, w); // 顶点w入队}}}
}

拓扑排序

  • 使用栈实现图的拓扑排序,输出顶点的拓扑序列。
void topSort(GraphMtx *g) {// 统计每一个顶点的入度for (int j = 0; j < g->numV; ++j) {for (int i = 0; i < g->numV; ++i) {if (g->edge[i][j] == 1)inDegree[j]++;}}// 定义一个栈ElemType stack[MAX_VERTEX_SIZE] = { 0 };int top = 0;// 把入度为0的顶点入栈for (int i = 0; i < g->numV; ++i) {if (inDegree[i] == 0) // 入度为0stack[top++] = i;}for (int i = 0; i < g->numV; ++i) { // 排序输出每一个顶点if (top == 0) {printf("图有回路.\n");return;}int v = stack[--top];printf("%c->", g->vList[v]);int w = getFirstNeighbor(g, g->vList[v]);while (w != -1) {if (--inDegree[w] == 0)stack[top++] = w;w = getNextNeighbor(g, g->vList[v], g->vList[w]);}}
}

六、参考资料

鲍鱼科技课件

b站免费王道课后题讲解: link
在这里插入图片描述

网课全程班: link
在这里插入图片描述

26王道考研书

http://www.dtcms.com/wzjs/208689.html

相关文章:

  • 徐州公司网站制作疫情最新政策最新消息
  • 做网站什么是解析什么是跳转seo搜索引擎优化是通过优化答案
  • 邯郸市永年区做网站的公司小红书seo是什么
  • 自建个网站怎么做关键词优化营销
  • 宽带办理网站建设武汉百度推广优化
  • 罗田县住房和城乡建设局网站百度后台管理
  • 网站运行环境建设方案网络营销策略存在的问题
  • 世界500强企业名字北京网站优化策略
  • 做网站要学的知识全球网站排名前100
  • 彩票系统网站开发沈阳网站seo公司
  • 重庆网站建设网搜科技太原网站建设方案咨询
  • 百度云网站建设东莞网络推广托管
  • 金融投资风险公司网站源码如何推广自己的微信公众号
  • 阳江 网站建设怎么做网络销售
  • 深圳网站建设方维网络百度一下你就知道啦
  • c 网站开发b站软件推广大全
  • wordpress网站怎么加小游戏杭州优化seo
  • .net做网站c#涟源网站seo
  • 建立自己的平台网站吗我是做推广的怎么找客户
  • 互联网营销师有必要考吗谷歌排名优化入门教程
  • 承接网站建设广告语线下推广渠道有哪些方式
  • 现在如何给网站做外链网上怎么推广产品
  • 电子商务网站登录企业内训机构
  • 网站维护和网页维护区别网络推广入门教程
  • 做网站后都需要什么网络市场调研的五个步骤
  • 深圳建设网站过程青岛谷歌优化
  • 鸽WordPress主题菏泽地网站seo
  • 网站域名背景百度推广哪种效果好
  • 网站建设对产品推销作用大吗近期国际热点大事件
  • 网站建设岗位要求seo关键词怎么优化