我试图使用邻接列表和PQ作为最小堆来实现单目标最短路径的Dijkstra算法。输出必须显示所有顶点到目标顶点的路径,如果路径存在,如果是,它的总和(最短),如果否,否路径。链接到整个代码
输入格式:
4
1 2 4 3 5 4 5
4 1 7 3 3
2 1 3 4 10
根据GDB,它显示了在提取最小函数时发现的分段故障。
Program received signal SIGSEGV, Segmentation fault.
0x00401746 in extractMin ()
客户. c
从文本中提取输入。txt文件并创建一个有向图
FILE *fptr = fopen("test.txt", "r");
if (fptr == NULL) exit(1);
int n;
if (fscanf(fptr, "%d", &n) == 1 && n > 0)
{
Graph *graph = createGraph(n);
int c;
while ((c = fgetc(fptr)) != EOF && c != '\n');
char *line = NULL;
size_t len = 0;
while (getline(&line, &len, fptr) > 0)
{
char *cur = line;
int ccs = 0;
int v1;
if (sscanf(cur, "%d%n", &v1, &ccs) == 1)
{
cur += ccs;
int v2;
int w;
while (sscanf(cur, "%d %d%n", &v2, &w, &ccs) == 2)
{
addEdge(graph, v1, v2, w);
cur += ccs;
}
fputc('\n', stdout);
}
}
free(line);
for (int i = 0; i < n; i++)
dijkstra(graph, i);
}
服务器. c
struct MinHeapNode* extractMin(MinHeap* minHeap)
{
if (isEmpty(minHeap))
return NULL;
struct MinHeapNode* root = minHeap->array[0];
struct MinHeapNode* lastNode = minHeap->array[minHeap->size - 1];
minHeap->array[0] = lastNode;
minHeap->pos[root->v] = minHeap->size-1;
minHeap->pos[lastNode->v] = 0;
--minHeap->size;
minHeapify(minHeap, 0);
return root;
}
void dijkstra(Graph* graph, int dest)
{
int v = graph->vertices;
int distance[v];
int pathFollow[1000]={0};
int ind = 0;
MinHeap* minHeap = createMinHeap(v);
for (int i = 0; i < v; ++i)
{
distance[v] = INT_MAX;
minHeap->array[v] = newMinHeapNode(v, distance[v]);
minHeap->pos[v] = v;
}
minHeap->array[dest] = newMinHeapNode(dest, distance[dest]);
minHeap->pos[dest] = dest;
distance[dest] = 0;
decreaseKey(minHeap, dest, distance[dest]);
minHeap->size = v;
while (!isEmpty(minHeap))
{
struct MinHeapNode* minHeapNode = extractMin(minHeap);
int u = minHeapNode->v;
AdjListNode* path = graph->array[u].head;
while (path != NULL)
{
int v = path->vertex;
if (isInMinHeap(minHeap, v) && distance[u] != INT_MAX &&
path->weight + distance[u] < distance[v])
{
distance[v] = distance[u] + path->weight;
if(pathFollow[ind-1] != u)
pathFollow[ind++]=u;
decreaseKey(minHeap, v, distance[v]);
}
path = path->next;
}
}
printArr(distance, v, pathFollow, dest);
}
void printArr(int dist[], int n, int pathFollow[], int dest)
{
printf("%d", dest+1);
int j = 0;
if(dist[n-1]!=0 && dist[n-1] < 100000000)
{
int k = j;
printf(" %d", pathFollow[k]+1);
while(pathFollow[j]!=0)
{
printf(" %d", pathFollow[j++]);
}
printf(" %d %d\n",n, dist[n-1]);
}
else
{
printf("NO PATH\n");
}
}
我不打算调试整个程序,但这里有几个错误:
>
你创造
Graph *graph = createGraph(n);
然后访问图形-
这是一个问题,因为
n
只是顶点的总数,在您的例子4中,但是当用类似4 1 7
的东西调用addEdge()
时,这就是堆缓冲区溢出。您需要考虑创建的0索引
数组。
另一个溢出问题(这次是堆栈缓冲区溢出)是:
int v = graph->vertices;
int distance[v];
但这被称为
distance[v] = INT_MAX;
同样,不考虑
0-indexed
数组。此外,该代码似乎可疑,我认为应该是distance[i]=INT_MAX
。
请查看您自己的代码以了解更多此类错误,尤其是数组索引溢出,使用地址清理器检查代码中的内存错误,逐步检查程序的每一行,并查看是否确实发生了预期的情况。您提到了
extractMin()
中的程序错误。检查它是否正在访问它应该访问的内存SIGSEGV
表示非法内存访问。struct MinHeapNode*root
是否指向您分配的内容?struct MinHeapNode*lastNode
是否指向您分配的内容?
数学模型 1. 近似 2. 增长数量级 3. 内循环 4. 成本模型 注意事项 1. 大常数 2. 缓存 3. 对最坏情况下的性能的保证 4. 随机化算法 5. 均摊分析 ThreeSum 1. ThreeSumSlow 2. ThreeSumBinarySearch 3. ThreeSumTwoPointer 倍率实验 数学模型 1. 近似 N3/6-N2/2+N/3 ~ N3/6。使用 ~f(
我正在使用ModBus RTU,并试图找出如何计算CRC16。我不需要代码示例。我只是对机制很好奇。我已经了解到,基本的CRC是数据字的多项式除法,根据多项式的长度,用零填充。下面的测试示例应该检查我的基本理解是否正确: 数据字:01001011 多项式:1001(x3+1) 由于最高指数x3而被填充3位 计算:0100 1011 000/1001->余数:011 计算。 null 第二次尝试:由
本文向大家介绍Java算法之递归算法计算阶乘,包括了Java算法之递归算法计算阶乘的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享的java算法计算阶乘,在学习Java课程时经常会遇到求阶乘问题,今天接跟大家一起探讨一下 代码如下: 运行结果:
第一部分:Top K 算法详解 问题描述 百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。 必备知识 什么是哈
算法 我注意到从第一章开始,容器就占据了STL喝彩声中最大的一份。在某种意义上,这是可以理解的。容器有着非凡的造诣,它们使大批C++程序员每天的基本生活变得简单。尽管如此,STL算法的权利也很重要,一样有能力减轻程序员的负担。事实上,有超过100个算法,很容易证明比起容器,它们提供给程序员更精巧的工具集(起码一样强)。也许它们的数量是一部分问题。搞清八种截然不同的容器类型明显比记住70个算法的名字
排序 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象稳定性 冒泡排序 O(n2) O(n2) O(1) 稳定 选择排序 O(n2) O(n2) O(1) 数组不稳定、链表稳定 插入排序 O(n2) O(n2) O(1) 稳定 快速排序 O(n*log2n) O(n2) O(log2n) 不稳定 堆排序 O(n*log2n) O(n*log2n) O(1) 不稳定 归并排序 O(n*
算法
目录 排序算法 检索算法