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
| #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 #define INF 0x3f3f3f typedef struct arcnode { int index; int weight; struct arcnode* next; } arcnode; typedef struct { int data; arcnode* firstarc; } vexnode; typedef struct { vexnode vers[MAXSIZE]; int vexnum,arcnum; }Gra; int Findmin(Gra *g, int *v){ int index, min = INF; for (int i = 0; i < g->vexnum; i++) { if (g->vers[i].data < min && !v[i]) { min = g->vers[i].data; index = i; } } if (min == INF){ return -1; } else return index; } void Dijkstra(Gra *g, int begin, int *v) { v[begin] = 1; arcnode *p = g->vers[begin].firstarc; while (p) { if (!v[p->index] && g->vers[begin].data + p->weight < g->vers[p->index].data) { g->vers[p->index].data = g->vers[begin].data + p->weight; } p = p->next; } int index = Findmin(g, v); if (index != -1) Dijkstra(g, index, v); }
void Print(Gra* g, int begin){ for (int i = 0; i < g->vexnum; i++) { if(i==begin) continue; printf("%d 到 %d 的距离为 %d \n",begin,i,g->vers[i].data); } } int main(){ Gra g; memset(&g, 0, sizeof(Gra)); scanf("%d %d", &g.vexnum, &g.arcnum); for (int i = 1; i < g.vexnum; i++) { g.vers[i].data = INF; } for (int i = 0; i < g.arcnum; i++) { int idx1, idx2, w; scanf("%d %d %d", &idx1, &idx2, &w); arcnode* t = (arcnode*)malloc(sizeof(arcnode)); t->index = idx2; t->weight = w; t->next = g.vers[idx1].firstarc; g.vers[idx1].firstarc = t; arcnode* p = (arcnode*)malloc(sizeof(arcnode)); p->index = idx1; p->weight = w; p->next = g.vers[idx2].firstarc; g.vers[idx2].firstarc = p; } int visited[g.vexnum]; memset(visited, 0, sizeof(visited)); Dijkstra(&g, 0, visited); Print(&g, 0); return 0; }
|