實現Floyd算法

#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;

}

相關文章
相關標籤/搜索