Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2014, 23:53   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
Вопрос Работа с графом

Добрый день!
Нужен совет! Голова уже не варит....
Код:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>

using namespace std;

const int INF = 100;   // Бесконечность

// Структура ребро
struct enge {
	int verOne;		// Первая вершина
	int verTwo;		// Вторая вершина
	int weight;		// Вес ребра
};

void InitMatrix(int **, int);
void DeleteMatrix(int **, int);
void PrintMatrix(int **, int);
void Kruskal(int **, enge *, bool *, int &, int);


int main() {
	setlocale(0, "rus");

	const int N = 5;			// Размер матрица 
	int eAmount = 0;			// Сумма ребер
	// Выделение памяти
	int **A = new int* [N];		// Матрица весов
	for(int i = 0; i < N; i++) {
		A[i] = new int[N];
	}
	enge *E = new enge [N * N];	// Матрица ребер
	bool *I = new bool [N];		// Индикатор включения ребра

	cout << "\n *********************\n * АЛГОРИТМ КРАСКАЛА *\n *********************" << endl;
	InitMatrix(A, N);			// Инициализация матрицы
	
	cout << endl << " Матрица весов:\n\n" 
				 << " (*) - бесконечность\n" << endl;
	PrintMatrix(A, N);
	Kruskal(A, E, I, eAmount, N);
	
	int summ = 0; 
    cout << "\n Список ребер:" << endl;
	for(int i = 0; i < eAmount; i++) {
		if(I[i]) {
			cout << " " << E[i].verOne << " -> " << E[i].verTwo << " - [ весом " << E[i].weight << "]" << endl;
			summ += E[i].weight;
		}
    }
	cout<<"\n Полная длина ребер: " << summ << endl;

	// Освобождение памяти
	DeleteMatrix(A, N);
	delete [] E;
	delete [] I;
	cout << endl;
	return 0;
}

/* Инициализация матрицы весов*/
void InitMatrix(int **A, int N) {
	srand((unsigned)time(NULL));
	
	for(int i = 0; i < N; i++) {
		for(int j = 0; j < N; j++) {
			if(i == j)		A[i][j] = 0;
			else if (j > i)	{
				A[i][j] = rand()%20 + 1;
				if(A[i][j] >=10)
					A[i][j] = INF;
			}
			else A[i][j] = A[j][i];
		}	
	}
	return;
}

/* Освобождение памяти */
void DeleteMatrix(int **Matrix, int N) {
	for(int i = 0; i < N; i++) {
		delete [] Matrix[i];
	}
	delete[] Matrix;
	return;
}

/* Распечатка матрицы */
void PrintMatrix(int **Matrix, int N) {
	
	for(int i = 0; i < N; i++) {
		for(int j = 0; j < N; j++) {
			if(Matrix[i][j] == INF)
				cout << setw(2) << "[*]";
			else
				cout << setw(2) << "[" << Matrix[i][j] << "]";
		}
		cout << endl << endl;
	}
	return;
}
/* Метод Крускала*/
void Kruskal(int **A, enge *E, bool *I, int &eAmount, int N) {
	int *W = new int [N];
	// Инициализация
	for(int i = 0; i < N; i++) {
		W[i] = i;
		I[i] = false;
	}
	// Создание списка ребер
	for(int i = 0; i < N; i++) {
		for(int j = (i + 1); j < N; j++) {
			if(A[i][j] != 0 && A[i][j] != INF) {
				eAmount++;				// Количество ребер
				E[eAmount - 1].verOne = i + 1;
				E[eAmount - 1].verTwo = j + 1;
				E[eAmount - 1].weight = A[i][j];
            }
		}
	}
	// Сортировка ребер
	for(int i = 0; i < (eAmount - 1); i++) {
		int min = i;
		for(int j = (i + 1); j < eAmount; j++) {
			if(E[j].weight < E[min].weight)	
				min = j; 
			enge tmp = E[i];
			E[i] = E[min];
			E[min] = tmp;
		}
    }
	// Проверка всех ребер
	for(int i = 0; i < eAmount; i++) {
		if(W[E[i].verTwo] != W[E[i].verOne]) {	// Если не найдено
            I[i] = true;							// Индикатор включения
			int indexOld = W[E[i].verOne];		
           
			for(int j = 0; j < N; j++) {
				if(W[j] == indexOld) {			
					W[j] = W[E[i].verTwo];		
                }
			}
		}
    }
	delete [] W;
	return;
}
Чувствую, что что-то упустил... Как мне кажется, результат немного не тот. Большая просьба посмотреть код. Может кто-нибудь что-нибудь заметит... Мне не по глазам. Заранее спасибо за любые комментарии, принимается любая критика .

Уважаемые форумчане.... конструктивная критика приветствуется
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 18.03.2014 в 20:54.
Bugrimov вне форума Ответить с цитированием
Старый 20.03.2014, 14:52   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Друзья форумчане.... !
Просьба конструктивно прокомментировать...
Может кто-нибудь подобное реализовывал, может что-нибудь добавить или убрать..
Код:
void Kruskal(int **A, enge *E, bool *I, int &eAmount, int N) {
	int *W = new int [N];
	// Инициализация
	for(int i = 0; i < N; i++) {
		W[i] = i;
		I[i] = false;
	}
	// Создание списка ребер
	for(int i = 0; i < N; i++) {
		for(int j = (i + 1); j < N; j++) {
			if(A[i][j] != 0 && A[i][j] != INF) {
				eAmount++;				// Количество ребер
				E[eAmount - 1].verOne = i + 1;
				E[eAmount - 1].verTwo = j + 1;
				E[eAmount - 1].weight = A[i][j];
            }
		}
	}
	// Сортировка ребер
	for(int i = 0; i < (eAmount - 1); i++) {
		int min = i;
		for(int j = (i + 1); j < eAmount; j++) {
			if(E[j].weight < E[min].weight)	
				min = j; 
			enge tmp = E[i];
			E[i] = E[min];
			E[min] = tmp;
		}
    }
	// Проверка всех ребер
	for(int i = 0; i < eAmount; i++) {
		if(W[E[i].verTwo] != W[E[i].verOne]) {	// Если не найдено
            I[i] = true;							// Индикатор включения
			int indexOld = W[E[i].verOne];		
           
			for(int j = 0; j < N; j++) {
				if(W[j] == indexOld) {			
					W[j] = W[E[i].verTwo];		
                }
			}
		}
    }
	delete [] W;
	return;
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с графом в паскале Panda Помощь студентам 3 21.06.2008 08:39
Помогите с графом в паскале neomaximus Помощь студентам 3 17.06.2008 18:37