使用鄰接矩陣實現dijkstara算法

#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

Graph_matrax init() {co

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;

}display

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 dijkstra(Graph_matrax g,int source,int distance[],int path1[]) {

bool stored[Max];

int i;

for (i = 0; i < g->number_vertex; i++) {

	distance[i] = g->G[source][i];
	
	stored[i] = false;

	if (distance[i] == 8888)   
	
		path1[i] = -1;
		
	else
	
	path1[i] = source;

}
distance[source] = 0;

stored[source] = true;

int j;

int min, v;


//控制次數,還有number_vertex-1個沒有放入集合中

for (j = 1; j < g->number_vertex; j++) {


	//先找到一個沒有放到集合的值
	
	for (i = 0; i < g->number_vertex; i++) {
	
		if (stored[i] == false) {
		
			min = distance[i];
			
			v = i;
			
			break;
		}
	 }

	//找出沒有放入到集合中,的權重最小的編號
	
	for (i = 0; i < g->number_vertex; i++) {
	
		if (distance[i] < min&&stored[i] == false) {
		
			v = i;
			
			stored[v] = true;
			
			break;
		}
	}
	
	//更新distance[],注意是爲放到集合中的
	
	for (int k = 0; k < g->number_vertex; k++) {
	
		if(stored[k] == false) {
		
			if (distance[k] > distance[v] + g->G[v][k]) {
			
				distance[k] = distance[v] + g->G[v][k];
				
				path1[k] = v;
		
			}
		}
	}
}

}

int main() {

Graph_g *g = init();

printf("%d\n", g->number_vertex);

display(g);

printf("\n");

//爲了不出現錯誤,把c[]所有設爲false

printf("\n");

int distance[Max];

int  path[Max];

dijkstra(g, 0,distance, path);

printf("到原點的距離\n");

int i;

for ( i = 0; i < g->number_vertex; i++)
{
	printf("%2d", distance[i]);
}
printf("\n");
for ( i = 0; i < g->number_vertex; i++)
{
	printf("%3d", path[i]);
}
printf("\n");
system("pause");
return 0;

}

相關文章
相關標籤/搜索