马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
[attachimg]166094[/att#include <stdio.h>
#include <stdlib.h>
#define scanf scanf_s
#define MAXVEX 16 // 最大顶点数
#define INFINITY 65535 // 用2的16次方来代表无穷大
typedef struct { // 邻接矩阵
char vexs[MAXVEX]; // 顶点表
int arc[MAXVEX][MAXVEX]; // 邻接矩阵
int numVertexes, numEdges; // 图中当前的顶点数和边数
} MGraph;
typedef int Pathatirx[MAXVEX][MAXVEX]; // 用于存储每条路径对应的长度
typedef int ShortPathTable[MAXVEX][MAXVEX]; // 路径数组; 用于存储到下标代表的顶点到对应的点的最短路径
// 建立邻接矩阵
void Create_MGraph(MGraph* head) {
int i, j, k, w;
printf("请输入顶点数和边数:\n");
scanf("%d %d", &head->numVertexes, &head->numEdges);
getchar(); //吸收换行符
printf("请录入顶点名称:");
for (i = 0; i < head->numVertexes; i++) { //录入顶点
scanf("%c", &head->vexs[i]);
getchar(); //吸收换行符
}
for (i = 0; i < head->numVertexes; i++) {
for (j = 0; j < head->numVertexes; j++) {
head->arc[i][j] = INFINITY; // 邻接矩阵初始化
}
}
printf("请输入边(i,j)的i,j和对应的权w;格式(i j w):\n");
for (k = 0; k < head->numEdges; k++) {
scanf("%d %d %d", &i, &j, &w);
head->arc[i][j] = w;
head->arc[j][i] = head->arc[i][j]; // 因为是无向网图,对称矩阵
}
}
void ShortestFath_Floyd(MGraph head, Pathatirx *P, ShortPathTable *D) {
int v, w, k;
//初始化D和P
for (v = 0; v < head.numVertexes; v++){
for (w = 0; w < head.numVertexes; w++){
(*D)[v][w] = head.arc[v][w];
(*P)[v][w] = w;
}
}
//优美的弗洛伊德算法
for (k = 0; k < head.numVertexes; k++) {
for (v = 0; v < head.numVertexes; v++) {
for (w = 0; w < head.numVertexes; w++) {
if ((*D)[v][w] > (*D)[v][k] + (*D)[k][w]) {
(*D)[v][w] = (*D)[v][k] + (*D)[k][w];
(*P)[v][w] = (*P)[v][k];
}
}
}
}
}
int main() {
MGraph head;
Pathatirx P;
ShortPathTable D;
Create_MGraph(&head);
ShortestFath_Floyd(head, 0, &P, &D);
}
achimg]
ShortestFath_Floyd函数多传了一个参数,或者函数声明的时候你少写了一个参数
|