Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.206.169] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте, помогите пожалуйста составить генерацию графа и алгоритм Прима в одном коде.
Вот мои наработки: #include <iostream> #include <conio.h> #include <iomanip> #include <stdlib.h> int a, b, u, v, n, x, y; int ne = 1; int visited[10] = {0}; int min; int mincost = 0; void gen_random_graph(int n) { srand(time(0)); int adj_matrix[n][n]; for(int u = 0; u < n; u++) { for (int v = u; v < n; v++) { //Вам не нужно рассчитывать вес дважды, поэтому цикл начинается с u if(adj_matrix[u][v] == adj_matrix[v][u]) { adj_matrix[u][v] = rand() % 10 + 1; std::cout << adj_matrix[u][v] << std::endl; } } } } int main() { int N; int adj_matrix[n][n]; std::cout << "Enter the number of vertices: "; std::cin >> N; gen_random_graph(N); int path[100] = {0}; //В этот массив будут записываться вершины, по которым составиться путь int path_index = 0; std::cout << "\nMatrix" << std::endl; //Введи матрицу for(int u = 0; u < N; u++) { for(int v = 0; v < N; v++) { std::cout << adj_matrix[u][v] << std::setw(5); } std::cout << "\n"; } while(ne < N) { for(u = 1, min = 999; u <= N; u++) for(v = 1; v <= N; v++) if(adj_matrix[u][v] < min) if(visited[u] != 0) { min = adj_matrix[u][v]; a = x = u; b = y = v; } if(visited[x] == 0 || visited[y] == 0) { path[path_index] = b; path_index++; //cout<<"\n "<<ne++<<" "<<a<<" "<<b<<min; //Можно вывести так ne++; //если строчку выше раскомментировать - эту закомментировать mincost += min; visited[b] = 1; } adj_matrix[a][b] = adj_matrix[b][a] = 999; } std::cout << "Minimum spanning tree\n"; //Минимальное остовное дерево std::cout << 1 << " --> "; for(int u = 0; u < N-1; u++) { std::cout << path[u]; if(u < N-2) { std::cout<<" --> "; } } std::cout << "\nMinimum cost " << mincost; //Минимальная стоимость std::cin.get(); return 0; } Прикреплённая картинка
Прикреплённая картинка
|
Сообщ.
#2
,
|
|
|
1. в функции gen_random_graph точно локальная переменная должна быть adj_matrix
2. Цитата zig_zag @ for(int u = 0; u < n; u++) { for (int v = u; v < n; v++) { //Вам не нужно рассчитывать вес дважды, поэтому цикл начинается с u if(adj_matrix[u][v] == adj_matrix[v][u]) { adj_matrix[u][v] = rand() % 10 + 1; std::cout << adj_matrix[u][v] << std::endl; } } } все здесь смотрится странно) вообще логика, ИМХО, в прожке какая-то странная... 1. объявил матрицу смежности (хотя у тебя ВЕСОВАЯ!) (лучше динамику сделай, т к кол-во вершин появляется в процесссссе работы программы) 2. в функции заполнил матрицу смежности (ВЕСОВ!), указывая тройки чисел: номера вершин и вес ребра между ними 3. в отдельной функции вывел на экран весовую матрицу короче, стремись к тому, чтобы 1 функция - 1 дело, можешь хоть 20 функций создать, это в разы перспективнее, чем лепить все подряд... |