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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2011, 12:15   #1
Li*zA
 
Регистрация: 09.12.2009
Сообщений: 3
Вопрос Подсчет числа компонент связности С++

Здравствуйте.
Очень нужна ваша помощь, сама уже устала этим заниматься. Неполучается.

Мне нужно найти число компонент связности, т.е. колличество несвязных (под)графов в одном большом графе, который задан матрицей смежности.
Делается это, вроде, поиском в глубину, но как это реализовать, я не знаю.

Вообще, задание у меня - найти цикломатическое число графа, я кое-чего уже сделала, а именно чтение графа из файла и подсчет всех остальных переменных, необходимых, чтобы найти цикломатическое число, а вот число компонент связности никак, это самое сложное

Вот мой код, но он не особо поможет с подсчетом числа компонент связности

Код:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
using namespace std;

int main ()
{
setlocale(LC_ALL,"rus");
int vert;					// Колличество вершин
int rib = 0;				// Удвоенное колличество ребер + колличество петель (т.е. единиц в матрице)
int loop = 0;				// Колличество петель 
ifstream fin("1.txt");
fin>>vert;					
if (vert < 1)
{
	cout << "ERROR(это не граф) ";
	return 1;
}
int **graph = new int*[vert];
	for(int i=0;i<vert; i++)
		{
			graph[i] = new int[vert];
		}	
		//Ввод таблицы из файла
		for (int i = 0; i < vert; i++ )
		{    
			for (int j = 0; j < vert; j++ )
			{	 
				fin >> graph[i][j]; 
				if (graph[i][j] == 1)
				{
					rib++;
				}
				else if (graph[i][j] == 0){}
				else 
				{
					cout << "ERROR(некорректные входные данные) ";
					return 1;
				}
			}
			if (graph[i][i] == 1)
				{
					loop=loop+1;
				}
		}
		cout << "Матирца смежности заданного графа:\n" ;
							//Вывод таблицы
		for (int i = 0; i < vert; i++ )
		{ 
			for (int j = 0; j < vert; j++ )
			{ 
				cout<<setw(5)<< graph[i][j] ; 
			}
				cout<<"\n" ; 
		}
		int result;
		result = 1 + (rib+loop)/2 - vert; // вместо еденички надо число компонент связности
		cout << "Цикломатическое число заданного графа = " ;
		cout << result << "\n";
}
Если кто поможет, буду очень признательна

PS Если создала тему не там, прошу простить.
Li*zA вне форума Ответить с цитированием
Старый 19.04.2011, 14:46   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Там же нет ничего сложного )

Берешь первую вершину, запускаешь с нее обход (поиск) в глубину (или в ширину, тут без разницы), отмечая все пройденные вершины. Когда поиск остановится - отмечены будут все вершины из первой компоненты связности. Дальше повторяешь поиск, начиная его с первой еще непомеченной вершины. И так пока все вершины не станут помеченными.

Естественно, это работает только для неориентированного графа )
Son Of Pain вне форума Ответить с цитированием
Старый 20.04.2011, 01:37   #3
Li*zA
 
Регистрация: 09.12.2009
Сообщений: 3
По умолчанию

да-да, я уже пробовала делать поиск в глубину.
Но мне, если честно, несовсем понятно, как это реализывовать.
И можно ли это сделать на основе того, что у меня уже есть, например добавив парочку функций или все делать заного, создавая всякие структуры или классы.
Li*zA вне форума Ответить с цитированием
Старый 20.04.2011, 05:41   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Реализовывать проще всего рекурсивно )
Добавляешь массив bool visited[vert], в котором будут храниться признаки посещенности вершин, и в цикле
Код:
пока (остались непосещенные вершины)
   вызвать обход в глубину или ширину, начиная с первой непосещенной вршины;
   увеличить счетчик компонент связности;
Что конкретно не получается? )
Son Of Pain вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет числа слов Heatrv Microsoft Office Word 3 30.09.2010 11:31
Подсчет числа одинаковых слов в нескольких категориях. Hagen83 Microsoft Office Excel 2 13.03.2010 09:45
подсчет методами php числа файлов в директории wlad115 PHP 2 25.01.2010 22:10
Подсчет числа переходов между 0 и 1 Sonyalex90 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 24.10.2009 21:20