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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2010, 22:19   #1
fallti
 
Регистрация: 10.05.2010
Сообщений: 8
По умолчанию Поиск в глубину и проверка связности

задание - с помощью пгв проверить связность графа, граф задан списком

написал код, который создает список и формирует пгв, но при входе в функцию вылетает ошибка.
функцию взял отсюда http://e-maxx.ru/algo/dfs

Код:
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
vector<vector<int>> Mat;
vector<int> Vec;
vector<char> used;
void dfs (int v) {
	used[v] = true;
	for (int i=0; Mat.size(); ++i)
		if (!used[i])
			dfs (i);
}

/////////////////////////Функция руссификации////////////////////////////
char *Rus(char *ps){
	char *buf=new char[strlen(ps)];
	CharToOemA(ps,buf);
	return buf;
}
int _tmain(int argc, _TCHAR* argv[]){

	cout<<Rus("Введите количество вершин:");
	int nCount,i=0;
	cin>>nCount;
	while(i!=nCount){
		cout<<Rus("Введите строку списка, если захотите закончить ввод нажмите -1:")<<endl;
		int op;
		for(int j=0;;++j){
			cin>>op;
			if(op!=-1){Vec.push_back(op);}
			else {break;}
		}
		Mat.push_back(Vec);
		Vec.clear();
		++i;
	}
	cout<<Rus("Введите вершину, с которой вы хотите построить пвг:");
	int v;
	cin>>v;
	dfs(v);
	
	return 0;
}
еще подскажите, пожалуйста, как после построения пгв проверить связность
за ранее благодарен
fallti вне форума Ответить с цитированием
Старый 11.05.2010, 00:14   #2
Alex_sim
Форумчанин
 
Аватар для Alex_sim
 
Регистрация: 18.02.2010
Сообщений: 164
По умолчанию

#include <locale.h>; setlocale(LC_ALL,"Russian"); руссификация намного проще на связность графа сейчас или утром напишу . . .
Alex_sim вне форума Ответить с цитированием
Старый 11.05.2010, 20:10   #3
fallti
 
Регистрация: 10.05.2010
Сообщений: 8
По умолчанию

спасибо за другой метод русификации, обязательно попробую, но мне граф важнее
fallti вне форума Ответить с цитированием
Старый 12.05.2010, 15:25   #4
Alex_sim
Форумчанин
 
Аватар для Alex_sim
 
Регистрация: 18.02.2010
Сообщений: 164
Радость

1. Первоначальная разметка
Пометим все вершины первым маркером - нам про них ничего не известно
Выберем любую вершину (например первую (или нулевую)), пометим ее вторым маркером, ведь она может быть достигнута сама из себя.
2. Разметка соседних вершин
Если нет вершин, помеченных вторым маркером - переходим к третьему этапу.
Выберем любую вершину, помеченную вторым маркером. Пометим ее третьим маркером. Все вершины, соседние с данной и помеченные первым маркером, пометим вторым маркером.
Повторим этот пункт с начала.
3. Завершение работы
Если нужно получить список вершин, входящих в одну компоненту связности с заданной вершиной, то выбираем вершины, помеченные третьим маркером, в отдельный массив.
Если нужно получить список вершин, не входящих в одну компоненту связности с заданной вершиной, то выбираем вершины, помеченные первым маркером в отдельный массив и возвращаем полученный массив.
Если нужно просто проверить граф на связность, то считаем вершины, помеченные первым маркером, и сравниваем получившееся число с нулем. Если число вершин, помеченные первым маркером, равно нулю, то граф связный.
И достаточно разделить вершины на 2 группы: 1. те, про которые ничего не известно и 2. про которые известно, что из них можно попасть в некую базовую вершину?
Тогда можно было бы рекурсивно распространять маркировку связности (перевод из группы 1 в группу 2) перебором в глубину (т.е. выбирать все смежные вершины с "неизвестным" состоянием, маркировать каждую и тут же выполнять для неё то же самое рекурсивно). Когда процесс закончится, останется посмотреть, все ли вершины промаркированы как связанные с исходной.
Отзывы не забываем))
Alex_sim вне форума Ответить с цитированием
Старый 12.05.2010, 21:47   #5
fallti
 
Регистрация: 10.05.2010
Сообщений: 8
По умолчанию

очень благодарен) большое спасибо)
fallti вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск кратчайшего пути в графе методом полного перебора в глубину. Метод ветвей и границ Олинька Помощь студентам 1 24.12.2008 16:22
Компоненты связности Imelstron Помощь студентам 3 31.12.2007 20:49