Поиск остовного леса минимального веса методом обхода в глубину (длины ребер считаются равными 1)
Вершины графа - точки плоскости на C++
Код на C++ #include <stdio.h> #define N 9 struct Vert { int n; Vert *next; }; Vert *a[N]; int was[N]; int tree[N][N]; // initialization void init() { for (int i = 0; i < N; i++) { a[i] = new Vert; a[i]->n = i; a[i]->next = 0; } } // add edge from v to what void add(int v, int what) { Vert *n = a[v]; while (true) { if (n->n == what) return; if (!(n->next)) break; n = n->next; } Vert *newV = new Vert; newV->next = NULL; newV->n = what; n->next = newV; } // delete edges void remove() { Vert *n, *cur; for (int i = 0; i < N; i++) { n = a[i]; while (n) { cur = n; n = n->next; delete cur; } } } // add edge from v1 to v2 and from v2 to v1 void edge(int v1, int v2) { add(v1, v2); add(v2, v1); } // deep search of spanning tree void gettree(int v) { tree[v][v] = 1; was[v] = 1; Vert *n; for (n = a[v]; n; n = n->next) if (!was[n->n]) { tree[n->n][v] = tree[v][n->n] = 1; gettree(n->n); } } // spanning forest void gettrees() { int i; for (i = 0; i < N; i++) was[i] = 0; for (i = 0; i < N; i++) if (!was[i]) gettree(i); } // show matrix void show(int *m) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) printf("%d ", m[i * N + j]); printf("\n"); } printf("---------------------\n"); } // show list void showlist(Vert **list) { Vert *n; for (int i = 0; i < N; i++) { n = a[i]; while (n) { if (n->next) printf("%d -> ", n->n); else printf("%d", n->n); n = n->next; } printf("\n"); } printf("---------------------\n"); } main() { for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) tree[i][j] = 0; init(); edge(0, 1); edge(0, 3); edge(0, 2); edge(1, 2); edge(2, 3); edge(4, 5); edge(4, 6); edge(5, 7); edge(6, 7); edge(6, 8); edge(7, 8); gettrees(); showlist(a); show(&tree[0][0]); remove(); }
|