数据结构图论用C语言实现骑马修栅栏

时间: 2023-07-07 08:46:27 浏览: 60
以下是使用C语言实现数据结构图论的骑马修栅栏算法的代码: ```c #include <stdio.h> #include <stdlib.h> #include <limits.h> // 图的邻接表结构体 struct AdjListNode { int dest; // 目标节点编号 int weight; // 边的权重 struct AdjListNode* next; }; // 图的邻接表头结构体 struct AdjList { struct AdjListNode* head; }; // 图结构体 struct Graph { int V; // 节点数 struct AdjList* array; }; // 栅栏结构体 struct Fence { int id; // 栅栏编号 int height; // 栅栏高度 }; // 栅栏比较函数 int cmp(const void *a, const void *b) { const struct Fence *fa = a; const struct Fence *fb = b; return fa->height - fb->height; } // 创建邻接表节点 struct AdjListNode* newAdjListNode(int dest, int weight) { struct AdjListNode* newNode = (struct AdjListNode*) malloc(sizeof(struct AdjListNode)); newNode->dest = dest; newNode->weight = weight; newNode->next = NULL; return newNode; } // 创建图 struct Graph* createGraph(int V) { struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph)); graph->V = V; graph->array = (struct AdjList*) malloc(V * sizeof(struct AdjList)); for (int i = 0; i < V; ++i) graph->array[i].head = NULL; return graph; } // 添加边 void addEdge(struct Graph* graph, int src, int dest, int weight) { struct AdjListNode* newNode = newAdjListNode(dest, weight); newNode->next = graph->array[src].head; graph->array[src].head = newNode; } // 迪杰斯特拉算法 void dijkstra(struct Graph* graph, int start, int* dist) { int V = graph->V; int* visited = (int*) malloc(V * sizeof(int)); for (int i = 0; i < V; i++) { visited[i] = 0; dist[i] = INT_MAX; } dist[start] = 0; for (int count = 0; count < V - 1; count++) { int u = -1; for (int i = 0; i < V; i++) if (!visited[i] && (u == -1 || dist[i] < dist[u])) u = i; visited[u] = 1; struct AdjListNode* node = graph->array[u].head; while (node != NULL) { int v = node->dest; int weight = node->weight; if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) dist[v] = dist[u] + weight; node = node->next; } } free(visited); } // 骑马修栅栏函数 void horseRepairFence(struct Fence *fences, int n, struct Graph* graph, int maxDiff) { int* dist = (int*) malloc(n * sizeof(int)); dijkstra(graph, 0, dist); int lastHeight = fences[0].height; // 上一个栅栏的高度 printf("修建栅栏:%d\n", fences[0].id); for (int i = 1; i < n; i++) { if (dist[i] == INT_MAX) { printf("无法修建到 %d 号栅栏\n", fences[i].id); continue; } if (dist[i] - (fences[i].height - lastHeight) > maxDiff) { // 如果与上一个栅栏的高度差超过了最大值 printf("修建栅栏:%d\n", fences[i].id); lastHeight = fences[i].height; } } free(dist); } int main() { int n; // 栅栏数量 int maxDiff; // 最大高度差 printf("请输入栅栏数量和最大高度差:"); scanf("%d %d", &n, &maxDiff); // 读入栅栏信息 struct Fence *fences = malloc(n * sizeof(struct Fence)); for (int i = 0; i < n; i++) { fences[i].id = i + 1; scanf("%d", &fences[i].height); } // 根据栅栏高度排序 qsort(fences, n, sizeof(struct Fence), cmp); // 创建图 struct Graph* graph = createGraph(n); for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { int weight = fences[j].id - fences[i].id; // 权重为栅栏之间的距离 addEdge(graph, i, j, weight); addEdge(graph, j, i, weight); } } // 骑马修栅栏 horseRepairFence(fences, n, graph, maxDiff); free(fences); free(graph); return 0; } ``` 代码中使用了图的邻接表结构体来存储图的信息,通过`createGraph`函数创建了一个V个节点的图,并使用`addEdge`函数添加了所有的边。在`horseRepairFence`函数中,首先使用迪杰斯特拉算法求出所有节点到起点的最短路径,然后根据栅栏高度和与上一个栅栏的距离以及最短路径来判断是否修建栅栏。最后在`main`函数中读入栅栏信息并进行排序,创建图,然后调用`horseRepairFence`函数进行修建栅栏。

相关推荐

最新推荐

recommend-type

用C语言实现从文本文件中读取数据后进行排序的功能

是一个十分可靠的程序,这个程序的查错能力非常强悍。程序包含了文件操作,归并排序和字符串输入等多种技术。对大家学习C语言很有帮助,有需要的一起来看看。
recommend-type

使用C语言实现CRC校验的方法

本篇文章是对使用C语言实现CRC校验的方法进行了详细的分析介绍,需要的朋友参考下
recommend-type

c语言实现把文件中数据读取并存到数组中

下面小编就为大家带来一篇c语言实现把文件中数据读取并存到数组中。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

C语言实现图的邻接矩阵存储操作

主要为大家详细介绍了C语言实现图的邻接矩阵存储操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

数据结构综合课设地图着色问题.docx

一、问题描述 设计地图着色软件,对江西地图中...1.地图采用图型数据结构,每个地级市为一个节点,边表示对应的两个地级市相邻。 2.设计着色算法,保证临接点不是同一种颜色。 3.演示程序以用户和计算机的对话方式进行
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

spring添加xml配置文件

1. 创建一个新的Spring配置文件,例如"applicationContext.xml"。 2. 在文件头部添加XML命名空间和schema定义,如下所示: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。