|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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函数多传了一个参数,或者函数声明的时候你少写了一个参数
|
-
|