实现Floyd算法

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

}

转载于:https://my.oschina.net/u/2511906/blog/3094181

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值