Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
4 / 4 / 0
Регистрация: 21.12.2015
Сообщений: 195

Поиск мостов

27.12.2017, 08:36. Показов 3688. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Да... я погорячился... В общем фиг его поймет как реализовать поиск мостов в таком классе...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
template <class T>
class edge{
private:
    T data;
public:
    edge(){};
    edge(T data):data(data){};
};
 
template <class T>
class Graph {
private:
    edge<T>*** adjacencyMatrix;
    int vertexCount;
 
public:
    Graph(int vertexCount);
    void Insert(int i, int j);
    void Delete(int i, int j);
    bool Edge(int i, int j);
    void SetEdge(int v1, int v2, T data);
    ~Graph();
 
};
template <class T>
Graph<T>::Graph(int vertexCount) {
    this->vertexCount = vertexCount;
        adjacencyMatrix = new edge<T>**[vertexCount];
    for (int i = 0; i < vertexCount; i++) {
        adjacencyMatrix[i] = new edge<T>*[vertexCount];
 
    for (int j = 0; j < vertexCount; j++)
        adjacencyMatrix[i][j] = NULL;
    }
}
 
template <class T>
void Graph<T>::Insert(int i, int j) {
    if (i >= 0 && i < vertexCount && j > 0 && j < vertexCount && adjacencyMatrix[i][j] == NULL && adjacencyMatrix[j][i] == NULL) {
        adjacencyMatrix[i][j] = new edge<T>;
        adjacencyMatrix[j][i] = new edge<T>;
    }
    else return;
}
 
template <class T>
void Graph<T>::Delete(int i, int j) {
    if (adjacencyMatrix[i][j] != NULL && adjacencyMatrix[j][i] != NULL) {
        delete adjacencyMatrix[i][j];
        delete adjacencyMatrix[j][i];
    }
    else return;
}
 
template <class T>
bool Graph<T>::Edge(int i, int j) {
    if (adjacencyMatrix[i][j] != NULL) return true;
    else return false;
}
template <class T>
void Graph<T>::SetEdge(int v1, int v2, T data){
    delete adjacencyMatrix[v1][v2];
    delete adjacencyMatrix[v2][v1];
    adjacencyMatrix[v1][v2] = new edge<T>(data);
    adjacencyMatrix[v2][v1] = new edge<T>(data);
}
template <class T>
Graph<T>::~Graph() {
    for (int i = 0; i < vertexCount; i++)
        delete[] adjacencyMatrix[i];
        delete[] adjacencyMatrix;
}
Конечно есть такой алгоритм...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const int MAXN = ...;
vector<int> g[MAXN];
bool used[MAXN];
int timer, tin[MAXN], fup[MAXN];
 
void dfs (int v, int p = -1) {
    used[v] = true;
    tin[v] = fup[v] = timer++;
    for (size_t i=0; i<g[v].size(); ++i) {
        int to = g[v][i];
        if (to == p)  continue;
        if (used[to])
            fup[v] = min (fup[v], tin[to]);
        else {
            dfs (to, v);
            fup[v] = min (fup[v], fup[to]);
            if (fup[to] > tin[v])
                IS_BRIDGE(v,to);
        }
    }
}
 
void find_bridges() {
    timer = 0;
    for (int i=0; i<n; ++i)
        used[i] = false;
    for (int i=0; i<n; ++i)
        if (!used[i])
            dfs (i);
}
Но как его адаптировать под этот класс...

Добавлено через 17 часов 9 минут
Окей, пойдем по пути говнокода... просто сделаем еще 1 матрицу, и заполним ее 0. Где будет ребро ставим 1... Вот теперь другой вопрос...
C++
1
void dfs (int v, int p = -1)
вот тут я не могу понять... Как может быть такая функция?
Причем в функции find_bridges, она используется с 1 аргументом
C++
1
2
3
for (int i=0; i<n; ++i)
        if (!used[i])
            dfs (i);
Вот как это запихать в класс... когда ты даже не понимаешь, как это возможно? (может фишка с++11 или еще какой стандарт...)

Добавлено через 3 часа 40 минут
Вуууааа, что это за функция магическая... До сих пор понять не могу, даже как это нагуглить правильно...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.12.2017, 08:36
Ответы с готовыми решениями:

Поиск мостов в графе
Доброй ночи,задача состоит в отыскании мостов в графе. Много где есть в свободном доступе алгоритм примерно такого рода: ...

Поиск мостов через матрицу смежности
Программа ищет мосты графа с помощью матрицы смежности. В коде есть ошибки. Не понимаю как их исправить если честно #include...

Нахождение мостов в графе.
Дан граф.Найти все мосты.Мост-ребро при удалении которого создается компонента связности(проще говоря если удалить такое ребро,то...

4
75 / 26 / 22
Регистрация: 22.06.2013
Сообщений: 127
27.12.2017, 12:22
Цитата Сообщение от Blekzet Посмотреть сообщение
C++
Выделить код

void dfs (int v, int p = -1)
вот тут я не могу понять... Как может быть такая функция?
Причем в функции find_bridges, она используется с 1 аргументом
Это называется функция со значением по умолчанию. При объявлении такой функции один или нескольким параметрам с конца присваиваются конкретные значения. В данном случае int p = -1 означает что если вызвать эту функцию без указания этого параметра, то внутри он будет равен -1.
1
4 / 4 / 0
Регистрация: 21.12.2015
Сообщений: 195
27.12.2017, 12:49  [ТС]
plapteshk, но я не могу это скомпилить... как это в класс записать? Определить в теле класса эту функцию (void dfs (int v, int p = -1), а потом вне класса вот так?
C++
1
2
template <class T>
void Graph<T>::dfs (int v, int p)
Добавлено через 25 минут
Да и я пригляделся, получается вот какая штука:
Это оригинальный алгоритм, если погуглить...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const int MAXN = ...;
vector<int> g[MAXN];
bool used[MAXN];
int timer, tin[MAXN], fup[MAXN];
 
void dfs (int v, int p = -1) {
    used[v] = true;
    tin[v] = fup[v] = timer++;
    for (size_t i=0; i<g[v].size(); ++i) {
        int to = g[v][i];
        if (to == p)  continue;
        if (used[to])
            fup[v] = min (fup[v], tin[to]);
        else {
            dfs (to, v);
            fup[v] = min (fup[v], fup[to]);
            if (fup[to] > tin[v])
                IS_BRIDGE(v,to);
        }
    }
}
 
void find_bridges() {
    timer = 0;
    for (int i=0; i<n; ++i)
        used[i] = false;
    for (int i=0; i<n; ++i)
        if (!used[i])
            dfs (i);
}
смущает функция поиска мостов
C++
1
2
3
4
5
6
7
8
void find_bridges() {
    timer = 0;
    for (int i=0; i<n; ++i)
        used[i] = false;
    for (int i=0; i<n; ++i)
        if (!used[i])
            dfs (i);
}
Буквально мы для каждого элемента массива used, задаем false...
А потом, еще раз проходим по нему, но проверяем, !false по сути... Это краааааааааайне странно... или я чего-то не понял...
0
75 / 26 / 22
Регистрация: 22.06.2013
Сообщений: 127
27.12.2017, 18:09
Лучший ответ Сообщение было отмечено Blekzet как решение

Решение

Цитата Сообщение от Blekzet Посмотреть сообщение
plapteshk, но я не могу это скомпилить... как это в класс записать? Определить в теле класса эту функцию (void dfs (int v, int p = -1), а потом вне класса вот так?
C++
Прототип в классе:
C++
1
void dfs (int v, int p = -1);
Определение:
C++
1
2
3
4
5
template <class T>
void edge<T>::dfs (int v, int p)
{
 
}

Цитата Сообщение от Blekzet Посмотреть сообщение
Буквально мы для каждого элемента массива used, задаем false...
А потом, еще раз проходим по нему, но проверяем, !false по сути... Это краааааааааайне странно... или я чего-то не понял...
Там же в функции dfs (i); меняются значения used. Это глобальная переменная.
1
4 / 4 / 0
Регистрация: 21.12.2015
Сообщений: 195
27.12.2017, 22:01  [ТС]
plapteshk, спасибо за ответы на столь тупые вопросы...

Добавлено через 42 минуты
Оставлю тут, может кому понадобится
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
int vertexCount;
bool *used;
int timer, *tin, *fup;
 
template <class T>
class edge{
private:
    T data;
public:
    edge(){};
    edge(T data):data(data){};
};
 
template <class T>
class Graph {
private:
    edge<T>*** adjacencyMatrix;
    int **MatrixForBrigeSearch;
    int vertexCount;
 
public:
    Graph(int vertexCount);
    void Insert(int i, int j);
    void Delete(int i, int j);
    bool Edge(int i, int j);
    void SetEdge(int v1, int v2, T data);
    ~Graph();
    void dfs (int v, int p = -1);
    void find_bridges();
    void print();
 
};
template <class T>
Graph<T>::Graph(int vertexCount) {
    this->vertexCount = vertexCount;
    adjacencyMatrix = new edge<T>**[vertexCount];
    MatrixForBrigeSearch = new int*[vertexCount];
    used = new bool[vertexCount];
    tin = new int[vertexCount];
    fup = new int[vertexCount];
 
    for (int i = 0; i < vertexCount; i++) {
        adjacencyMatrix[i] = new edge<T>*[vertexCount];
        MatrixForBrigeSearch[i] = new int[vertexCount];
 
        for (int j = 0; j < vertexCount; j++){
            adjacencyMatrix[i][j] = NULL;
            MatrixForBrigeSearch[i][j] = 0;
        }
    }
}
 
template <class T>
void Graph<T>::Insert(int i, int j) {
    --i;
    --j;
    if (i >= 0 && i < vertexCount && j > 0 && j < vertexCount && adjacencyMatrix[i][j] == NULL && adjacencyMatrix[j][i] == NULL) {
        adjacencyMatrix[i][j] = adjacencyMatrix[j][i] = new edge<T>;
        MatrixForBrigeSearch[i][j] = MatrixForBrigeSearch[j][i] = 1;
    }
    else return;
}
 
template <class T>
void Graph<T>::Delete(int i, int j) {
    if (adjacencyMatrix[i][j] != NULL && adjacencyMatrix[j][i] != NULL) {
        delete adjacencyMatrix[i][j];
        delete adjacencyMatrix[j][i];
        delete MatrixForBrigeSearch[i][j];
        delete MatrixForBrigeSearch[j][i];
    }
    else return;
}
 
template <class T>
bool Graph<T>::Edge(int i, int j) {
    if (adjacencyMatrix[i][j] != NULL) return true;
    else return false;
}
template <class T>
void Graph<T>::SetEdge(int v1, int v2, T data){
    delete adjacencyMatrix[v1][v2];
    delete adjacencyMatrix[v2][v1];
    adjacencyMatrix[v1][v2] = new edge<T>(data);
    adjacencyMatrix[v2][v1] = new edge<T>(data);
}
template <class T>
Graph<T>::~Graph() {
    for (int i = 0; i < vertexCount; i++)
        delete[] adjacencyMatrix[i];
        delete[] adjacencyMatrix;
}
template <class T>
void Graph<T>::dfs (int v, int p) {
    used[v] = true;
    tin[v] = fup[v] = timer++;
    for (int i = 0; i < vertexCount; ++i)
    {
        if(MatrixForBrigeSearch[v][i] == 1)
        {
            int to = i;
            if (to == p)  continue;
            if (used[to]) fup[v] = min (fup[v], tin[to]);
            else
            {
                dfs (to, v);
                fup[v] = min (fup[v], fup[to]);
                if (fup[to] > tin[v]) cout << "bridge: " << v + 1 << " , " << to + 1 << endl;
            }
        }
    }
}
template <class T>
void Graph<T>::find_bridges() {
    timer = 0;
    for (int i=0; i<vertexCount; ++i) used[i] = false;
 
    for (int i=0; i<vertexCount; ++i) if (!used[i]) dfs (i);
 
}
template <class T>
void Graph<T>::print(){
    for (int i=0; i<vertexCount; i++) {
        for (int j=0; j<vertexCount; j++) {
            cout << " " << MatrixForBrigeSearch[i][j];
        }
        cout << endl;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2017, 22:01
Помогаю со студенческими работами здесь

Реализация поиска мостов на графе
Подскажите, в чем проблема. Вроде весь код написан верно, но ничего не считает в итоге. У меня есть неориентированный граф, который я задаю...

Алгоритм нахождения всех мостов графа
Нужно использовать матрицу смежности. Можно ли это реализовать так: строится матрица смежности . Проставляются значения. (или...

Определить минимально возможное количество мостов, которые необходимо задействовать при строительстве метрополитена
Помогите, пожалуйста #include &lt;iostream&gt; using namespace std; int main() { int N,K,M,c,x,y,t; int *v; ...

Поиск мостов в графе
дано условие: найти мосты в графе. порылся в книжках и соорудил вот это. vector&lt;int&gt; g; bool used; int timer, tin, fup; ...

1 ШИМ на 10 Н-мостов
Есть вот такая схемка управления маломощными движками: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru