#include<stdio.h>
#include<stdlib.h>
#define Max 10
typedef char elementType;
//定义图顶点相关的内容
typedef struct Graph_g {
elementType peek[Max];
int number_vertex;//定义顶点个数
int nubmer_edge;//定义边的个数
int G[Max][Max];//定义临接矩阵
bool c[Max];
}Graph, *Graph_matrax;
//对图进行初始化
Graph_matrax init() {
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;
}
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;
}