1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| #include <stdio.h> #include <stdlib.h>
#define MAX 32767
typedef struct Graph { char* vexs; int** arcs; int vexNum; int arcNum; }Graph;
Graph* initGraph(int vexNum) { Graph* G = (Graph*)malloc(sizeof(Graph)); G -> vexs = (char*)malloc(sizeof(char) * vexNum); G -> arcs = (int**)malloc(sizeof(int*) * vexNum); for (int i = 0 ; i < vexNum; i++) { G -> arcs[i] = (int*)malloc(sizeof(int) * vexNum); } G -> vexNum = vexNum; G -> arcNum = 0; return G; }
void createGraph(Graph* G, char* vexs, int* arcs) { for (int i = 0 ; i < G -> vexNum; i++) { G -> vexs[i] = vexs[i]; for (int j = 0; j < G -> vexNum; j++) { G -> arcs[i][j] = *(arcs + i * G -> vexNum + j); if (G -> arcs[i][j] != 0 && G -> arcs[i][j] != MAX) G -> arcNum ++; } } G -> arcNum /= 2; }
void DFS(Graph* G, int* visited, int index) { printf("%c\t", G -> vexs[index]); visited[index] = 1; for (int i = 0; i < G ->vexNum; i++) { if (G -> arcs[index][i] > 0 && G -> arcs[index][i] != MAX && !visited[i]) { DFS(G, visited, i); } } }
void floyd(Graph* G) { int d[G -> vexNum][G -> vexNum]; int p[G -> vexNum][G -> vexNum]; for (int i = 0; i < G -> vexNum; i++) { for (int j = 0; j < G -> vexNum; j++) { d[i][j] = G -> arcs[i][j]; if (G -> arcs[i][j] > 0 && G -> arcs[i][j] != MAX) { p[i][j] = i; } else p[i][j] = -1; } }
for (int i = 0; i < G -> vexNum; i++) { for (int j = 0; j < G -> vexNum; j++) { for (int k = 0; k < G -> vexNum; k++) { if (d[j][i] + d[i][k] < d[j][k]) { d[j][k] = d[j][i] + d[i][k]; p[j][k] = p[i][k]; } } } }
for (int i = 0; i < G -> vexNum; i++) { for (int j = 0; j < G -> vexNum; j++) { printf("%d ", d[i][j]); } printf("\n"); } printf("\n"); for (int i = 0; i < G -> vexNum; i++) { for (int j = 0; j < G -> vexNum; j++) { printf("%d ", p[i][j]); } printf("\n"); } }
int main() { Graph* G = initGraph(4); int* visited = (int*)malloc(sizeof(int) * G -> vexNum); for (int i = 0; i < G -> vexNum; i++) visited[i] = 0; int arcs[4][4] = { 0, 1, MAX, 3, 1, 0, 2, 2, MAX, 2, 0, 8, 3, 2, 8, 0 }; createGraph(G, "1234", (int*)arcs); DFS(G, visited, 0); printf("\n"); floyd(G); return 0; }
|