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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2013, 22:03   #1
Retoyfer
 
Регистрация: 08.03.2012
Сообщений: 8
По умолчанию Алгоритм для печати эйлерового маршрута, С++

Задание состояло в том, чтоб найти и напечатать эйлеров маршрут в графе. Код-то написать получилось, а вот заставить работать - нет. Где-то ошибка, но мне никак не удается найти где именно.
Подскажите, пожалуйста, где она может быть. Спасибо.

Сам код:
Код:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <cstring>

using namespace std;
typedef short unsigned shun; 

struct graph {
	vector <vector <int> > adjNodes;
};

struct coords {
	shun i;
	shun j;
};

void PrintEulerTour (graph& G);
void PrintEulerUtil (shun u, graph& G);
bool IsValidNextEdge (shun u, shun v, graph G);
int  DFSCount (shun index, graph& G, vector <bool>& used);
void RemoveEdge (shun u, shun v, graph& G);
coords RmEdge (shun u, shun v, graph& G);
void AddEdge (shun u, shun v, graph& G, coords&);

int main () {
	shun numberOfNodes;
	shun node;

	fstream file;
	file.open ("./data.in", ios::in);

	file >> numberOfNodes;
	cout << numberOfNodes << endl;

	graph Graph;
	Graph.adjNodes.resize(numberOfNodes);

	vector <shun> numberOfAdjNodes (numberOfNodes);
	vector <vector <shun> > adjNodes;
	for (shun i = 0; i < numberOfAdjNodes.size(); i++) {
		
		file >> node;

		file >> numberOfAdjNodes[node - 1];
		cout << setiosflags (ios::left) << setw(3) << node-1
							<< setw(4) << numberOfAdjNodes[node - 1];

		vector <shun> tmp(numberOfAdjNodes);
		for (shun j = 0; j < numberOfAdjNodes[node - 1]; j++) {
			file >> tmp[j];
			cout << setiosflags (ios::left) << setw(3) << tmp[j]-1;
			tmp[j]--;
			Graph.adjNodes[i].push_back (tmp[j]);			
		}		 
		cout << endl;		
	}

	numberOfAdjNodes.~vector();
	file.close();

	PrintEulerTour (Graph);	

	system("PAUSE");
	return 0;
}

void PrintEulerTour (graph& G) {
	shun u = 0;
	for (shun i = 0; i < G.adjNodes.size(); i++) {
		if (G.adjNodes[i].size() & 1) {
			u = i;
			break;
		}
	}
	PrintEulerUtil(u, G);
	cout << endl;
}

void PrintEulerUtil (shun u, graph& G) {
	for (int f : G.adjNodes[u]) {
		int v = f;
		//cout << f << "\t" << endl;
		// If edge u-v is not removed and it's a valid next edge
		if (v != -1 && IsValidNextEdge (u, v, G)) {
			cout << u <<  "-" << v << " ";
			RemoveEdge(u, v, G);
			PrintEulerUtil (u, G);
		}
	}
}

// The function to check if edge u-v can be considered as next edge in
// in Eulerian path
bool IsValidNextEdge (shun u, shun v, graph G) {
	// The edge u-v is valid in one of the following two cases:
 
    // 1) If v is the only adjacent vertex of u
	shun count = 0;
	for (int f : G.adjNodes[u]) {
		if (f != -1) { count++; }
	}
		if (count == 1)
			return true;
		
	// 2) If there are multiple adjacents, then u-v is not a bridge
    // Do following steps to check if u-v is a bridge

	// 2.a) count of vertices reachable from u
	vector <bool> used (G.adjNodes.size());

	for(shun i = 0; i < G.adjNodes.size(); i++) {
        used[i] = false;
	}	

	shun count1 = DFSCount(u, G, used);
	
    // 2.b) Remove edge (u, v) and after removing the edge, count
    // vertices reachable from u
	
	coords uv = RmEdge(u, v, G);

	for(shun i = 0; i < G.adjNodes.size(); i++) {
        used[i] = false;
	}
    shun count2 = DFSCount(u, G, used);
	
	AddEdge (u, v, G, uv);
	return (count1 > count2)? false : true;
}

// A DFS based function to count reachable vertices from v
int DFSCount (shun index, graph& G, vector <bool>& used) {
	used[index] = true;
	int count = 1;

	for (int r : G.adjNodes[index]) {
		if (r != -1 && !used[r]) {
			count += DFSCount (r, G, used);
		}
	}
	return count;
}


void RemoveEdge (shun u, shun v, graph& G) {
	for (shun i = 0; i < G.adjNodes[u].size(); i++) {
		if (G.adjNodes[u][i] == v) {	
			G.adjNodes[u][i] = -1;
			break;		
		}
	}
	
	for (shun j = 0; j < G.adjNodes[v].size(); j++) {
		if (G.adjNodes[v][j] == u) {	
			G.adjNodes[v][j] = -1;
			break;
		}
	}
}

// This function removes edge u-v from graph.  It removes the edge by
// replacing adjcent vertex value with -1.
coords RmEdge (shun u, shun v, graph& G) {
	coords uv;
	for (uv.i = 0; uv.i < G.adjNodes[u].size(); uv.i++) {
		if (G.adjNodes[u][uv.i] == v) {	
			G.adjNodes[u][uv.i] = -1;
			break;		
		}
	}
	
	for (uv.j = 0; uv.j < G.adjNodes[v].size(); uv.j++) {
		if (G.adjNodes[v][uv.j] == u) {	
			G.adjNodes[v][uv.j] = -1;
			break;
		}
	}
	return uv;
}

void AddEdge (shun u, shun v, graph& G, coords& uv) {
	G.adjNodes[u][uv.i] = v;
	G.adjNodes[v][uv.j] = u;
}
Входной файл такой:
В первом ряду количество вершин.
В каждом последующем - номер вершины, количество вершин смежных с этой и сами смежные вершины.

Содержание входного файла data.in:
10
1 2 4 9
2 4 3 4 9 10
3 2 2 4
4 4 1 2 3 7
5 3 6 7 9
6 4 3 5 7 8
7 4 4 5 6 10
8 3 6 7 10
9 4 1 2 5 10
10 4 2 7 8 9
Retoyfer вне форума Ответить с цитированием
Старый 30.10.2013, 06:38   #2
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Цитата:
Код-то написать получилось
судя по большому кол-ву англоязычных комментариев, вы его не сами писали...откуда вяли?сайт?
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 30.10.2013, 07:11   #3
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Комментарий, вбитый в гугль, дает шикарный результат (кликабельно).
Цитата:
Код-то украсть получилось, а вот включить мозг и разобраться - нет
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 30.10.2013, 07:21   #4
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

действительно... хотя по большому счету немножко не дотянул))
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 30.10.2013, 18:35   #5
Retoyfer
 
Регистрация: 08.03.2012
Сообщений: 8
По умолчанию

Да, код переписан с чужого. Но было интересно разбираться в том, как все таки работает алгоритм.
Но в свою защиту могу сказать, что код все же не скопирован, а переписан.
Но да, я об этом не сказала - моя вина, извините, не подумала, что это будет иметь значение. Теперь понимаю, что ошибалась. Учту.
Retoyfer вне форума Ответить с цитированием
Старый 30.10.2013, 19:48   #6
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

та не в этом дело) это здорово, что вы пытаетесь разбираться! просто вопрос был задан для того чтобы видеть откуда вы взяли,и что у вас не так работает(сравнив с оригиналом). то что вы переписали,а не тупо скопировали тоже видно. но видимо суть не до конца уловили. завтра можно поразбираться, хватит на сегодня)
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 30.10.2013, 22:02   #7
Retoyfer
 
Регистрация: 08.03.2012
Сообщений: 8
По умолчанию

SaLoKiN, спасибо на добром слове)
Retoyfer вне форума Ответить с цитированием
Старый 31.10.2013, 04:14   #8
Retoyfer
 
Регистрация: 08.03.2012
Сообщений: 8
По умолчанию

Ошибка была пустяковая - всего лишь опечатка
Retoyfer вне форума Ответить с цитированием
Старый 31.10.2013, 05:10   #9
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

т.е. проблема решена? =) отлично! может тогда покажете конечный результат, чтобы все видели ;-)
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 31.10.2013, 22:54   #10
Retoyfer
 
Регистрация: 08.03.2012
Сообщений: 8
По умолчанию

Как освобожусь, обязательно)
Retoyfer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Версия для печати KANDRAT JavaScript, Ajax 3 12.12.2012 16:01
Нахождение Эйлерового цикла (Графы) too lame Помощь студентам 1 17.12.2011 20:19
Нахождение Эйлерового цикла(delphi) too lame Помощь студентам 1 16.12.2011 22:22
алгоритм нахождения наилучшего маршрута между двумя заданными городами Uli9 Общие вопросы Delphi 28 18.11.2008 16:59
алгоритм нахождения наилучшего(кратчайшего) маршрута между двумя заданными городами Uli9 Помощь студентам 4 14.11.2008 15:03