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