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

高清设计网站推荐sem和seo的工作

高清设计网站推荐,sem和seo的工作,云南网络科技有限公司,深圳网站建设熊掌号使用C语言实现图的创建以及遍历等基本操作 文章目录 图基本概念邻接矩阵和邻接表对比定义图创建图添加边深度优先遍历DFS运行 广度优先遍历BFS运行 迪杰斯特拉算法运行 弗洛伊德算法运行 图基本概念 图由顶点和边组成。根据边之间的方向性可以分为有向图和无向图,无…

使用C语言实现图的创建以及遍历等基本操作

文章目录

  • 图基本概念
  • 邻接矩阵和邻接表对比
  • 定义图
  • 创建图
  • 添加边
  • 深度优先遍历DFS
    • 运行
  • 广度优先遍历BFS
    • 运行
  • 迪杰斯特拉算法
    • 运行
  • 弗洛伊德算法
    • 运行

图基本概念

图由顶点和边组成。根据边之间的方向性可以分为有向图和无向图,无向图表示双向关系,有向图表示单向关系。

邻接矩阵和邻接表对比

在C语言中,图的创建可以通过邻接矩阵和邻接表两种方式来实现。

  • 邻接表使用链表数组来表示图中所有顶点之间关系。每个顶点都有一个链表,链表中的每个节点表示从该顶点出发的边。优点是对稀疏图来说节省大量空间,适用于稀疏图。
  • 邻接矩阵使用二维数组来表示节点之间的权值。优点是直观便于理解,缺点是对于稀疏图来说,会浪费大量空间,适用于稠密图。

本文中使用邻接矩阵来表示无向图。假设顶点从编号0开始。

定义图

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>#define MAX_VERTICES 10typedef struct Graph {int vertices; // 图节点个数int adjMatrix[MAX_VERTICES][MAX_VERTICES]; // 图中边的关系
} Graph;

创建图

不带权重版:0表示不连通,1表示连通

void createGraph(Graph *graph, int vertices) {graph->vertices = vertices;for (int i = 0; i < vertices; i++) {for (int j = 0; j < vertices; j++) {graph->adjMatrix[i][j] = 0;}}
}

带权值版:INT_MAX表示不连通

void createGraphWithWeight(Graph *graph, int vertices) {graph->vertices = vertices;for (int i = 0; i < vertices; i++) {for (int j = 0; j < vertices; j++) {if (i==j) {graph->adjMatrix[i][j] = 0;}else {graph->adjMatrix[i][j] = INT_MAX;}}}
}

添加边

void addEdge(Graph *graph, int u, int v) {graph->adjMatrix[u][v] = 1;graph->adjMatrix[v][u] = 1;
}
void addEdgeWithWeight(Graph *graph, int u, int v, int weight) {graph->adjMatrix[u][v] = weight;graph->adjMatrix[v][u] = weight;
}

深度优先遍历DFS

沿着一条路径深入探索,直到尽头,再回溯到上一个节点尝试其他路径。
递归通过栈来管理函数调用的层级,和DFS纵深优先的特性非常契合。

void DFS(Graph *graph, int vertex, bool visited[]) {// 最先访问起点visited[vertex] = true;printf("%d ", vertex);for (int i = 0; i < graph->vertices; i++) {// 递归访问连通且未访问的所有节点if (graph->adjMatrix[vertex][i] && !visited[i]) {DFS(graph, i, visited);}}
}void DFSTraverse(Graph *graph, int startVertex) {bool visited[MAX_VERTICES] = {false};DFS(graph, startVertex, visited);
}

运行

如何建立图:
在这里插入图片描述

int main() {Graph graph;createGraph(&graph, 4);addEdge(&graph, 0, 1);addEdge(&graph, 0, 2);addEdge(&graph, 1, 3);DFSTraverse(&graph, 0);
}

先遍历0–1–3
再回溯到1–2
在这里插入图片描述

广度优先遍历BFS

从一个未访问的顶点开始,先遍历这个顶点的所有相邻节点,再依次遍历每个相邻节点的相邻节点。
利用队列先进先出的特性,将待访问顶点的相邻节点依次放入队列中,然后依次出队列,实现广度优先遍历

void BFSTraverse(Graph *graph, int startVertex) {bool visited[MAX_VERTICES] = {false};int queue[MAX_VERTICES] = {0};int front=-1, rear=-1;//起始顶点加入队列queue[++rear] = startVertex;visited[startVertex] = true;while(rear != front) {int currentVertex = queue[++front];printf("%d ", currentVertex);for (int i = 0; i < graph->vertices; i++) {if (graph->adjMatrix[currentVertex][i] && !visited[i]) {// 将未访问且连通的加入队列queue[++rear] = i;visited[i] = true;}}}
}

运行

先遍历0的邻居节点0–1–2
再遍历1和2的邻居节点3
在这里插入图片描述

迪杰斯特拉算法

用于寻找单源最短路径

  • 采用一个一维数组标志节点是否已访问(也就是是否加入节点集中)
  • 采用另外一个数组记录未包含在节点中的节点到该节点集的最短距离,初始到其他结点距离都是INT_MAX。
  • 采用贪心算法,每次都选取距离节点集最近且未被访问的节点加入到节点集中,然后再根据这个节点更新最短距离数组。
int findMinIndex(Graph *graph, bool visited[], int distance[]){int nodeNum = graph->vertices;int min = INT_MAX,minIndex = 0;for(int i=0;i<nodeNum;i++){if(!visited[i] && distance[i]<min){min = distance[i];minIndex = i;}}return minIndex;
}void dijkstra(Graph *graph, bool visited[], int distance[]){int nodeNum = graph->vertices;printf("加入节点集顺序:\n");// 解释下这里为什么是nodeNum-1,如果最后只剩一个节点不在节点集的时候,那么节点与节点集直接只有一条路径,就没有优化的必要了。for(int count=0;count<nodeNum-1;count++){int current = findMinIndex(graph, visited, distance);visited[current] = true;printf("%d\t", current);for(int i=0;i<nodeNum;i++) {if (!visited[i]&& distance[current] != INT_MAX&& graph->adjMatrix[current][i] != INT_MAX&& distance[current] + graph->adjMatrix[current][i]< distance[i]) {distance[i] = distance[current] + graph->adjMatrix[current][i];}}}printf("\n");
}void dijkstraFun(Graph *graph, int start) {int nodeNum = graph->vertices;bool visited[nodeNum];int distance[nodeNum];for(int i=0;i<nodeNum;i++){distance[i] = INT_MAX;visited[i] = false;}distance[start] = 0;dijkstra(graph, visited, distance);for(int i=0;i<nodeNum;i++){if (i != start) {printf("到节点 %d 的最短距离是:%d\n",i, distance[i]);}}
}

运行

我们从网上随便找一个迪杰斯特拉的图,然后建立节点和边,进行测试
这里uvwxyz分别对应012345
在这里插入图片描述

int main() {Graph graph;createGraphWithWeight(&graph, 6);addEdgeWithWeight(&graph, 0, 1,2);addEdgeWithWeight(&graph, 0, 2,5);addEdgeWithWeight(&graph, 0, 3,1);addEdgeWithWeight(&graph, 1, 2,3);addEdgeWithWeight(&graph, 1, 3,2);addEdgeWithWeight(&graph, 2, 3,3);addEdgeWithWeight(&graph, 2, 4,1);addEdgeWithWeight(&graph, 2, 5,5);addEdgeWithWeight(&graph, 3, 4,1);addEdgeWithWeight(&graph, 4, 5,2);dijkstraFun(&graph, 0);
}

可以非常容易验证下面结果的正确性。
在这里插入图片描述

弗洛伊德算法

用于寻找多源最短路径

采用动态规划的思想,通过不断更新节点之间的最短路径长度来逐步求解任意两个节点之间的最短路径。
原理可以参考这个: 弗洛伊德(Floyd’s)算法—解决最短路径经典算法

void Floyd(Graph *graph){int len = graph->vertices;int i,j,k;printf("初始化矩阵:\n");for(i=0;i<len;i++) {for(j=0;j<len;j++) {if(graph->adjMatrix[i][j] != INT_MAX) {printf("%d\t",graph->adjMatrix[i][j]);}else {printf("∞\t");}}printf("\n");}for(k=0;k<len;k++){for (i = 0; i < len; i++) {for (j = 0; j < len; j++) {if(graph->adjMatrix[i][k] != INT_MAX&& graph->adjMatrix[k][j] != INT_MAX&& graph->adjMatrix[i][j] > graph->adjMatrix[i][k] + graph->adjMatrix[k][j]){graph->adjMatrix[i][j] = graph->adjMatrix[i][k] + graph->adjMatrix[k][j];}}}}printf("调整后的矩阵:\n");for(i=0;i<len;i++) {for(j=0;j<len;j++) {if(graph->adjMatrix[i][j] != INT_MAX) {printf("%d\t",graph->adjMatrix[i][j]);}else {printf("∞\t");}}printf("\n");}
}

运行

int main() {Graph graph;createGraphWithWeight(&graph, 6);addEdgeWithWeight(&graph, 0, 1,2);addEdgeWithWeight(&graph, 0, 2,5);addEdgeWithWeight(&graph, 0, 3,1);addEdgeWithWeight(&graph, 1, 2,3);addEdgeWithWeight(&graph, 1, 3,2);addEdgeWithWeight(&graph, 2, 3,3);addEdgeWithWeight(&graph, 2, 4,1);addEdgeWithWeight(&graph, 2, 5,5);addEdgeWithWeight(&graph, 3, 4,1);addEdgeWithWeight(&graph, 4, 5,2);Floyd(&graph);
}

在这里插入图片描述

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

相关文章:

  • 网站服务器安全配置同城版网站建设
  • 网站建设客户功能详细要求中国字幕组回怼韩国媒体
  • 淘宝网站开发技术名称网站伪静态怎么设置
  • 云南省建设厅建管处网站门户网站建设方案是什么意思
  • 律师在哪个网站做推广比较好wordpress主题图片路径设置
  • 二级造价师邢台网站优化定制
  • 福州优秀网站建设公司莱芜
  • 沛县互助网站开发个人社保缴费基数怎么算
  • 如何查找网站备案邯郸小学网站建设
  • 网站仿制大同网站建设哪里好
  • 做网站要自己租服务器列举网免费发布信息网
  • 电商网站模板html国家住建部官网
  • 漂亮的手机网站模板查看wordpress主题
  • 定制型网站设计学校网站设计图片
  • 濮阳市住房和城乡建设局网站服装设计就业前景如何
  • 自动化科技产品网站建设wordpress首页做全屏
  • 空间设计网站大全那里网站建设好
  • 自己手机怎么免费做网站html制作新闻页面代码
  • 食品 网站源码网站销售流程
  • ps做营销型网站布局百度联盟网站有哪些
  • 免费进入电影网站人人网入口网站建设选择云主机吗
  • 注销主体备案与网站备案wordpress产品相册
  • 国内 响应式网站女孩做网站合适吗
  • 个人备案网站名dede 网站地图 文章
  • 企业网站优化做法网站建设公司广告标题语
  • 微信群投票网站怎么做的优质的专业网站建设
  • 招商网站建设费用价格推广网站详细教程
  • 信邦建设工程有限公司网站上海工商网
  • 0基础学习网站建设wordpress 移动端模板下载地址
  • 协会网站建设北京 做网站