voidKruskal() { EDG b[20];//*(&b[0])@10 int markz[10] = {0}; int size = EDGinit(b); printf("\n"); sort(size, b); int start, end; for (int i = 0; i b.b[k][j]) { shortest[j] = b.b[k][j]; adjek[j] = k; } } //k为上处的k,即为与当前节点最相近的节点 //因为是贪心算法,所以当当前节点与a节点的权值要小于名为k节点的与a节点的值时,代表当前与a最近的是k。
注意其中的1,2是在一个大循环中实现的,因为要遍历所有的点
1 2 3 4 5 6 7 8
int j, i, k, min; k = 0; for (i = 1; i b.b[k][j]) { shortest[j] = b.b[k][j]; adjek[j] = k; } } }
Kruskal算法
基本思路:把每条路径的权值储存起来,然后从小到大依次选择,只要不形成回路即可
定义一个边集数组,存储起始节点和权值,定义一个可以并查集的数组来判断是否形成了循环
遍历边集数组并排序
遍历排序后到边集数组
注意并查集的判断来防止形成循环
完整代码(不包含调用的自定义函数)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
voidKruskal() { EDG b[20];//*(&b[0])@10 int markz[10] = {0}; int size = EDGinit(b); printf("\n"); sort(size, b); int start, end; for (int i = 0; i 0; i--) { for (j = i - 1; j >= 0; j--) { if (b[i].power 0) { x = mark[x]; } return x; }
voidDijkstra(int v1) { int low[MAX] = {0}; int final[MAX] = {0}; int i, j, k, min, w; //初始化 for ( i = 0; i 广搜找最短,然后去找加入这个点后是否有比以前的路更短的方法,因为要记录的东西更多了所以把记录最短路径和前一个节点的数组开到了两位而已==**完全不一样好嘛**==