#include<stdio.h>3d
#include<stdlib.h>code
#define Max 10element
typedef char elementType;get
//定義圖頂點相關的內容it
typedef struct Graph_g {io
elementType peek[Max]; int number_vertex;//定義頂點個數 int nubmer_edge;//定義邊的個數 int G[Max][Max];//定義臨接矩陣 bool c[Max];
}Graph, *Graph_matrax;di
//對圖進行初始化co
Graph_matrax init() {display
Graph_matrax graph = (Graph_matrax)malloc(sizeof(Graph)); int vertex; printf("請輸入頂點的個數\n"); scanf("%d", &vertex); graph->number_vertex = vertex; graph->nubmer_edge = 0; int i; //對頂點的信息進行賦值 for (i = 0; i < vertex; i++) { getchar(); char c; printf("請輸入%d個頂點的信息:", i + 1); scanf("%c", &c); graph->peek[i]=c; } //臨接矩陣的對腳線賦值爲0,其餘的初始化爲最大值,假設全都不連通 for (int i = 0; i < graph->number_vertex; i++) { for (int j = 0; j < graph->number_vertex; j++) { if (i == j) graph->G[i][j] = 0; else graph->G[i][j] = 8888; } } int edge = 0; int v1, v2, w; printf("請輸入邊的數目:"); scanf("%d", &edge); for (i = 0; i < edge; i++) { printf("請輸入i,j,w,有關頂點的到頂點的邊的相關信息:"); scanf("%d%d%d", &v1, &v2, &w); graph->G[v1 - 1][v2 - 1] = w; graph->G[v2 - 1][v1 - 1] = w; } return graph;
}path
void display(Graph_matrax g) {
printf("輸出臨接矩陣:\n"); for (int i = 0; i < g->number_vertex; i++) { for (int j = 0; j < g->number_vertex; j++) { printf("%8d", g->G[i][j]); } printf("\n"); }
}
void Floyd(Graph_matrax g,int d[Max][Max],int path[Max][Max]) {
int i, j, k; for(i=0;i<g->number_vertex;i++) for (j = 0; j< g->number_vertex; j++) { d[i][j] = g->G[i][j]; path[i][j] = -1; } int temp; for (k = 0; k < g->number_vertex; k++) { for (i = 0; i < g->number_vertex; i++) for (j = 0; j < g->number_vertex; j++) { temp = d[i][k] + d[k][j]; if (temp < d[i][j]) { d[i][j] = temp; path[i][j] = k; path[j][i] = k; } } }
}
void shortPath(Graph_matrax g,int c[Max][Max],int source,int des) {
int k = c[source][des]; if (k==-1){ printf("%3d", source); return; } shortPath(g, c,source,k); printf("%3d", k);
}
int main() {
Graph_g *g = init(); printf("%d\n", g->number_vertex); display(g); int i, j; int d[Max][Max]; int path[Max][Max]; Floyd(g, d,path); for (i = 0; i < g->number_vertex; i++) { for (j = 0; j < g->number_vertex; j++) { printf("%3d", d[i][j]); } printf("\n"); } printf("\n"); for (i = 0; i < g->number_vertex; i++) { for (j = 0; j < g->number_vertex; j++) { printf("%3d", path[i][j]); } printf("\n"); } for (i = 0; i < g->number_vertex; i++) { for (j = 0; j < g->number_vertex; j++) { if (i <= j) { shortPath(g, path, i, j); if (i != j) printf("%3d", j); printf("\n"); } } printf("\n"); } system("pause"); return 0;
}