Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- #define INF 9999999
- #define _x 0
- #define _y 1
- #define _w 2
- class graph {
- private:
- int** G;
- int** T;
- int V;
- int U;
- public:
- graph() {
- G = NULL;
- T = NULL;
- V = -1;
- U = -1;
- }
- graph(int _V, int _U) {
- V = _V;
- U = _U;
- G = new int* [V];
- for (int i = 0; i < V; i++) {
- G[i] = new int[V];
- for (int j = 0; j < V; j++)
- cin >> G[i][j];
- }
- T = new int* [V - 1];
- for (int i = 0; i < V - 1; i++) {
- T[i] = new int[3];
- }
- }
- int** setGk() {
- int** Gk = new int* [U];
- for (int i = 0; i < U; i++)
- Gk[i] = new int[3];
- int k = 0;
- for (int i = 0; i < V; i++)
- for (int j = i + 1; j < V; j++)
- if (G[i][j] != 0) {
- Gk[k][_w] = G[i][j];
- Gk[k][_x] = i;
- Gk[k][_y] = j;
- k++;
- }
- return Gk;
- }
- void kruskal();
- void prima();
- void print() {
- cout << "Edge :" << " Weight" << endl;
- for (int i = 0; i < V - 1; i++)
- cout << T[i][_x] << " - " << T[i][_y] << " : " << T[i][_w] << endl;
- }
- };
- void sortGk(int** Gk, int U) {
- for (int i = 1; i < U; i++)
- for (int j = 0; j < U - i; j++)
- if (Gk[j][_w] > Gk[j + 1][_w]) {
- int* tmp = Gk[j];
- Gk[j] = Gk[j + 1];
- Gk[j + 1] = tmp;
- }
- }
- void graph::kruskal() {
- bool *visited = new bool[V]();
- int** Gk = setGk();
- sortGk(Gk, U);
- int k = 0;
- for (int i = 0; i < U; i++)
- if (!visited[Gk[i][_x]] || !visited[Gk[i][_y]]) {
- T[k][_w] = Gk[i][_w];
- T[k][_x] = Gk[i][_x] + 1;
- T[k][_y] = Gk[i][_y] + 1;
- k++;
- visited[Gk[i][_x]] = true;
- visited[Gk[i][_y]] = true;
- }
- }
- void graph::prima() {
- int no_edge = 0;
- bool *visited = new bool[V]();
- visited[0] = true;
- while (no_edge < V - 1) {
- int min = INF;
- int x = 0;
- int y = 0;
- for (int i = 0; i < V; i++)
- if (visited[i])
- for (int j = 0; j < V; j++)
- if (!visited[j] && G[i][j])
- if (min > G[i][j]) {
- min = G[i][j];
- x = i;
- y = j;
- }
- T[no_edge][_x] = x + 1;
- T[no_edge][_y] = y + 1;
- T[no_edge][_w] = min;
- visited[y] = true;
- no_edge++;
- }
- }
- int main() {
- graph g(10, 16);
- g.kruskal();
- g.print();
- cout << endl;
- g.prima();
- g.print();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement