Консультация # 186373: Здравствуйте! Прошу помощи в следующем вопросе: В курсовой работе по дискретной математике присутствует такое задание: 1.Изучить алгоритм 2.Составить программу алгоритма 3.Отладить тестовые примеры 4.Провести оценку сложности алгоритма 5.Составить прикладную задачу, для решения которой используется данный алгоритм
В курсовой работе по дискретной математике присутствует такое задание:
1.Изучить алгоритм 2.Составить программу алгоритма 3.Отладить тестовые примеры 4.Провести оценку сложности алгоритма 5.Составить прикладную задачу, для решения которой используется данный алгоритм
Я не умею писать программы, но задание нужно сдать.Очень прошу помощи
у экспертов портала, помогите, пожалуйста, написать программу к этому алгоритму!( на языке Си )
Преподаватель не требовательный, в программировании не разбирается, проверяет только работоспособность программы.
Описываемый здесь алгоритм был предложен независимо Косараю (Kosaraju) и Шариром (Sharir) в 1979 г. Это очень простой в реализации алгоритм, основанный на двух сериях поисков в глубину, и потому работающий за время O(n+m).
На первом шаге алгоритма выполняется серия обходов в глубину, посещающая весь граф. Для этого мы проходимся по всем вершинам графа и из каждой ещё не посещённой вершины вызываем обход в глубину. При этом для каждой вершины v запомним
время выхода tout[v]. Эти времена выхода играют ключевую роль в алгоритме, и эта роль выражена в приведённой ниже теореме. Определения
Ориентированный ациклический граф (directed acyclic graph) — это орграф, не содержащий направленных циклов. Алгоритм 1. Инвертируем ребра исходного орграфа. 2. Запускаем поиск в глубину на этом обращенном графе. В результате получаем вектор обхода. 3. Запускаем поиск в глубину на исходном графе, в очередной
раз выбирая непосещенную вершину с максимальным номером в векторе, полученном в п.2. 4. Полученные деревья из п.3, и являются сильно связными компонентами.
Код :
// 186373.cpp : Defines the entry point for the console application.
#include <vector>
#include <iostream>
using namespace std;
vector < vector<int> > g, gr; //g - graf gr transponirovanny graf
vector<char> used; //pometki vershin
vector<int> order, component;
void dfs1 (int v) {
used[v] = true;
int n=g[v].size();
for (size_t i=0; i<n; ++i)
if (!used[ g[v][i] ])
dfs1 (g[v][i]);
order.push_back (v);
}
void dfs2 (int v) {
used[v] = true;
component.push_back (v);
for (size_t i=0; i<gr[v].size(); ++i)
if (!used[ gr[v][i] ])
dfs2 (gr[v][i]);
}
int main() {
int n;
//... чтение n ...
cout<<"vvedite kolichestvo vershin"<<endl;
cin >>n;
g.resize(n);
gr.resize(n);
for (;;) {
int a, b;
// ... чтение очередного ребра (a,b) ...
cout<<"vvedite rebro"<<endl;
cin >>a;
if (a==0) break;
cin >>b;
g[a-1].push_back (b-1);
gr[b-1].push_back (a-1);
}
used.assign (n, false);
for (int i=0; i<n; ++i)
if (!used[i])
dfs1 (i);
used.assign (n, false);
for (int i=0; i<n; ++i) {
int v = order[n-1-i];
if (!used[v]) {
dfs2 (v);
// ... вывод очередной component ...
cout << "componenta silnoy svyaznosti"<< endl;
for (int k=0; k<component.size(); ++k) {
cout << component[k]+1;
}
cout << endl;
component.clear();
}
}
}
Консультировал: Асмик Гаряка (Советник)
Дата отправки: 16.06.2012, 14:47
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!