克鲁斯卡尔的算法实现
Kruskal's algorithm implementation
我正在C++中实现Kriskal的算法,但是...
DAA.exe 中0x0127160d处未处理的异常:0xC0000005:访问冲突读取位置0xdd2021d4。
它在getRoot函数中的这一行停止:
while(cities[root].prev != NO_PARENT(
我认为问题出在城市数组中的数据上。当我在数组中打印所有数据时,这不是我想要的。城市的名称是这样的"══════════════════¤¤¤ФалЗЎ■ю■"和数字(int( - 像这样(-842150451(。下面是完整的代码。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define NO_PARENT -1
struct city {
char name[11];
int prev;
};
struct path {
unsigned i, j, price;
};
bool comparsion(path p1, path p2) {
return p1.price > p2.price;
}
int getRoot(city *cities, int cityNumber) {
int root = cityNumber, tmp;
while(cities[root].prev != NO_PARENT)
root = cities[root].prev;
while(cityNumber != root) {
tmp = cityNumber;
cityNumber = cities[cityNumber].prev;
cities[tmp].prev = root;
}
return root;
}
bool isListed(city *cities, int n, char cityName[]) {
for(int i = 0; i < n; i++)
if(strcmp(cities[i].name, cityName))
return true;
return false;
}
int getCityNumber(city *cities, int n, char cityName[]) {
for(int i = 0; i < n; i++)
if(strcmp(cities[i].name, cityName))
return i;
return NO_PARENT;
}
int minPrice(city *cities, path *paths, int cityCount, int pathCount) {
unsigned minPrice = 0;
// sort paths by price
std::sort(paths, &paths[pathCount-1], comparsion);
for(int k = 0; k < pathCount; k++) {
printf("path: %d - %dn", paths[k].i, paths[k].j);
int c1 = getRoot(cities, paths[k].i), c2 = getRoot(cities, paths[k].j);
if(c1 != c2) {
minPrice += paths[k].price;
cities[c2].prev = c1;
}
}
return minPrice;
}
int main() {
int n, m, k;
do {
scanf("%d %d %d", &n, &m, &k);
} while(n < 2 || n > 10001 || m < -1 || m > 100001 || k < -1 || k > 100001);
city* cities = (city*)malloc(n*sizeof(city));
path* paths = (path*)malloc((m + k)*sizeof(path));
int addCities = 0;
char city1[11], city2[11];
for(int i = 0; i < (m + k); i++) {
scanf("%s %s", city1, city2);
if(addCities < n && !isListed(cities, n, city1)) { // if city1 is not into cities
// add it
strcpy(cities[addCities].name, city1);
cities[addCities].prev = NO_PARENT;
addCities++;
}
paths[i].i = getCityNumber(cities, n, city1); // number of city1
if(addCities < n && !isListed(cities, n, city2)) { // if city2 is not into cities
// add it
strcpy(cities[addCities].name, city2);
cities[addCities].prev = NO_PARENT;
addCities++;
}
paths[i].j = getCityNumber(cities, n, city1); // number of city2
if(i >= m)
scanf("%d", &paths[i].price);
}
for(int i = 0; i < (m + k); i++)
printf("%s: %dn", cities[i].name, cities[i].prev);
// Calculate min price
printf("%d ", minPrice(cities, paths, n, k + m));
system("pause");
return 0;
}
在isListed((和getCityNumber((中,使用strcmp((来检查字符串的相等性。你这样做的方式有两个问题:
- 当两个字符串相等时,strcmp 返回 0,因此您需要检查 if( strcmp(...( == 0 (。这是C语言中这些奇怪的东西之一。
-
错误定位后,您需要将 cities[i].name 设置为例如"未命名"或只是"\0"。否则,strcmp 将在未初始化的字符串上被调用 - 如果它们在 11 个字符内不包含空字符,它将失败。在 malloc 行后添加以下代码:
for( int i = 0 ; i < n ; ++ i ) { cities[ i ].name[ 0 ] = ' '; cities[ i ].parent = NO_PARENT; }
你必须
初始化"cities"。n 个城市之间有 (m+k( 条路径,但这并不一定意味着所有 n 个城市都包含在这些路径中,因为您已将城市的 prev 成员设置为NO_PARENT
每当它被列为 city1 或 city2 时,当一个城市从未被列为其 prev 成员时,它将未定义,当您将其用作 getRoot 函数中的索引时while(cities[root].prev != NO_PARENT)
root = cities[root].prev;
这会导致问题。
相关文章:
- 为什么在此排序算法实现中,向量明显比数组慢?
- 如何检查 CNG Windows API 是否返回符合 FIPS 的算法实现
- 递归合并排序算法实现
- OpenGL:布雷森汉姆的线条绘制算法实现
- 微小加密算法实现会产生意想不到的结果
- 在c++中使用合并排序算法实现计数反转
- 我正在尝试为 Kruskal 算法实现一个C++程序,该程序需要我按权重对图形进行排序。如何按权重对结构进行排序
- 最近点对O(nlogn)算法——c++实现中的一些数据问题
- 算法实现错误(DFS)
- 如何为涉及对象成员、间接寻址和强制转换的排序算法实现lambda函数
- 算法实现与 C++ 和 PHP 进行比较
- 如何仅使用 stl 算法实现此函数
- 三边化(2D)算法实现
- 扩展 Dijkstra 算法实现
- 使用霍夫曼树解码算法/实现
- 弗洛伊德-沃歇尔算法实现的问题
- OpenCV中的自适应算法实现
- 克鲁斯卡尔的算法实现
- 用于选择随机子集的通用算法实现
- 非递归 Kosaraju 的两次传递算法实现需要很长时间才能在大型数据集上执行