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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2013, 21:38   #1
RayBM
Новичок
Джуниор
 
Регистрация: 18.09.2012
Сообщений: 2
По умолчанию Visual C++. Вершинное покрытие. Алгоритм с возвратом.

Дано:
Граф G=<V,E>. Найти минимальное вершинное покрытие алгоритмом с возвратом.

Не могу до конца довести сам возврат. Кто может помочь навести на правильную мысль? Выводит покрытие, только не минимальное. В функции реализовал вроде бы возврат, но чего-то там не хватает. Не могу понять чего именно.
Код:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <vector>
#include <fstream>

using namespace std;

vector<vector<bool>> matrix;
vector<bool> used_E;
vector<bool> used_V;
vector<bool> OptV;
unsigned int v, e;
	int dop=0;//Осталось ребер
	int cost = 0;//Цена покрытия
	int Optcost=0;

//Сделан механизм первого перебора
void VertexCover(int i)
{
	if(!used_V[i])
	{
		if(v-cost==1) return;//Минимальное вершинное покрытие не может быть равно всем вершинам в графе
		used_V[i] = true;
		cost++;
		for(int j = 0; j<e;j++)
		{
			if(matrix[i][j]&&!used_E[j])
				used_E[j]=true;
			else if(!used_E[j])
				dop++;
		}
		if(dop==0)
		{
		Optcost = cost;
			for(int i = 0; i < v;i++)
				OptV[i] = used_V[i];
			return; 
		}//Найдено решение
		dop = 0;
		VertexCover(i+1);
	}
	else
	{
		used_V[i] = false;
		for(int j = 0; j < e; j++)
		{
			if(matrix[i][j])
			{
				for(int m = 0; m < v; m++)
					if(matrix[m][j]&&(!used_V[m]))
						used_E[j] = false;
			}
		}
	}
}

int main()
{
	setlocale(LC_ALL , "Russian");
	
	cout << "\t\t***Поиск вершинного покрытия***\n\n";
	cout << "Ввод из файла graph.txt\n\n";

	ifstream file;
	file.open("graph.txt");

	if(!file.is_open())
	{
		cout << "Не удалось открыть файл graph.txt\n";
		_getch();
		return -1;
	}
	
	file  >> v >> e;
	cout << "\nКол-во вершин: " << v << endl;
	cout << "Кол-во ребер: " << e << endl;

	cout << "Граф заданный матрицей инцедентности:\n";
	OptV.resize(v+1);
	used_V.resize(v+1);
	used_E.resize(e+1);
	matrix.resize(v+1);
	for(int i = 0; i < v;i++)
		matrix[i].resize(e+1);

	for(int i = 0; i < e; i++)
	{
		int v1,v2;
		file>>v1>>v2;
		matrix[v1-1][i] = true;
		matrix[v2-1][i] = true;
	}

	for(int i = 0; i < v; i++)
	{
		for(int j = 0; j < e;j++)
		{
			cout << matrix[i][j] << " ";
		}
		cout << endl;
	}
	cout << "Находим минимальное вершинное покрытие" << endl;

	VertexCover(0);

	for(int i = 0; i < v; i++)
		if(OptV[i])
			cout << i+1 << " ";

	_getch();
	return 0;
}

Последний раз редактировалось RayBM; 17.06.2013 в 21:44.
RayBM вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм с возвратом Галания Общие вопросы Delphi 1 16.05.2011 15:30
вершинное число независимости kir_rik Помощь студентам 1 18.04.2010 18:55
Вершинное покрытие графа WindWalker Помощь студентам 0 18.12.2009 12:34