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

Написать программу, описывающую класс "граф"

26.05.2024, 19:38. Показов 853. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток! Помогите найти ошибку в коде. Само задание выглядит так: написать программу , описывающую класс "граф". граф должен храниться в виде списка смежности. в программе должны быть реализованы следующие функции: считывание графа из текстового файла, содержащего в себе матрицу смежности графа (без указания количества вершин), вывод списка смежности графа на экран, обход графа в ширину.

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
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
 
using namespace std;
 
class Graph {
private:
    vector<vector<int>> adjList;
 
public:
    void readGraphFromFile(const string& filename) {
        ifstream file(filename);
        if (!file.is_open()) {
            cout << "Error opening file." << endl;
            return;
        }
 
        int value;
        while (file >> value) {
            if (adjList.empty()) {
                adjList.push_back(vector<int>{value});
            } 
            else {
                adjList.back().push_back(value);
            }
        }
 
        file.close();
    }
 
    void printAdjList() {
        int n = adjList.size();
            for (int i = 0; i < n; ++i) {
            cout << "Vertex " << i << " is adjacent to: ";
            for (int j = 0; j < n; ++j) {
                if (adjList[i][j] == 1) {
                    cout << j << " ";
                //cout << adjList[i][j] << " ";
                }
            }
            cout << endl;
        }
    }
    
    void BFS(int start) {
        
        vector<bool> visited(adjList.size(), false);
        queue<int> q;
        vector<int> visitedNodes;
 
        q.push(start);
        visited[start] = true;
 
         while (!q.empty()) {
            int current = q.front();
            q.pop();
           
            if (!visited[current]) {
                visitedNodes.push_back(current);
                visited[current] = true;
            //visitedNodes.push_back(current);
 
                for (int i : adjList[current]) {
                    if (!visited[i]) {
                         q.push(i);
                        visited[i] = true;
                    }
                }
            }
         }
    }
    cout << "Visited nodes: ";
    for (int node : visitedNodes) {
        cout << node << " ";
    }
    cout << endl;
    
};
 
int main() {
    Graph graph;
    graph.readGraphFromFile("graph.txt");
    graph.printAdjList();
    cout << "BFS traversal starting from vertex 0: ";
    graph.BFS(0);
 
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.05.2024, 19:38
Ответы с готовыми решениями:

Написать программу, описывающую структуру, содержащую указанные поля и выполняющую над ней указанные действия
Требуется помощь 1. Описать структуру с именем PRICE, содержащую следующие поля: - GOODS – название товара; - SHOP – название...

Написать программу, описывающую массив записей
Написать программу, описывающую массив записей, содержащий информацию об успеваемости учащихся группы: 1. ФИО (тип сhar ): 2. название...

Написать программу, описывающую математическую модель атома
Помогите :С

9
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.05.2024, 20:24
Цитата Сообщение от oliaN Посмотреть сообщение
Помогите найти ошибку в коде.
Что бы помочь найти ошибку, её, ошибку, нужно описать.
Где это описание ?

0
0 / 0 / 0
Регистрация: 19.05.2024
Сообщений: 6
26.05.2024, 20:32  [ТС]
если б я знала, может и не спрашивала бы... один семестр только плюсы изучаем.
Одну ошибку уже исправила, } не там стояла. но все равно что-то не так
предположу, что в readGraphFromFile ...
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.05.2024, 20:53
Цитата Сообщение от oliaN Посмотреть сообщение
если б я знала
Так не бывает. Если вы не знаете даже в чём/как эта ошибка проявляется, значит вы просто ленитесь !

Вы проверили работу графа на заранее составленном графе, не из файла ?
Или наоборот, отдельно проверили корректность чтения из файла ?

Добавлено через 55 секунд
Хинт : разбивайте задачу на более мелкие. Будет легче. Не пытайтесь обнять гору.

Добавлено через 5 минут
Цитата Сообщение от oliaN Посмотреть сообщение
предположу, что в readGraphFromFile ...
Ну вот видите.
Читаете первую строку, считаете сколько элементов считано, это будет размер матрицы смежности.
Сбрасываете/закрываете файл.
Читаете заново, по уже известному размеру.
1
0 / 0 / 0
Регистрация: 19.05.2024
Сообщений: 6
26.05.2024, 20:58  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Читаете первую строку, считаете сколько элементов считано, это будет размер матрицы смежности.
Сбрасываете/закрываете файл.
Читаете заново, по уже известному размеру.
Теоретически - это понятно, а синтаксически - нет
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.05.2024, 21:18
Лучший ответ Сообщение было отмечено oliaN как решение

Решение

Вот самый говнопростой пример как это сделать : Чтение данных из файла в квадратную матрицу

Добавлено через 19 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
простой пример
Я бы не читал весь файл целиком.

Демка : https://onlinegdb.com/fdK781Mu-
Тут :
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
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
int GetAdjMatrixSize(std::string filename){
    std::ifstream fin(filename);
    std::string line;
    if (getline(fin, line) && !line.empty()){
        std::istringstream iss(line);
        int size = 0, e;
        while( iss >> e && ++size)
            ;
        return size;
    }
    return 0;
}
 
void PrintAsAdjList(std::string filename, int n){
    std::ifstream fin(filename);
    for(int v = 0, e = 0; v != n; ++v){
        std::cout << (v + 1) << " : ";
        for(int w = 0; w != n; ++w){
            fin >> e;
            if (e)
                std::cout << (w + 1) << ' ';
        }
        std::cout << std::endl;
    }
}
int main(){
    int n = 0;
    if (n = GetAdjMatrixSize("input.txt")){
        PrintAsAdjList("input.txt", n);
    }else{
        std::cout << "Somthing wrong";
    }
 
}
input.txt :
Code
1
2
3
4
0 1 0 0
1 0 1 0
0 1 0 1
0 0 1 0
possible output as adjacent list :
Code
1
2
3
4
1 : 2 
2 : 1 3 
3 : 2 4 
4 : 3
2
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
26.05.2024, 21:30
Я так понимаю, код просто взят откуда-то и не делает то, что в задании написано.

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
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <optional>
#include <queue>
#include <vector>
#include <valarray>
 
template<typename Vertex = int, typename Weight = double>
class WeightedAdjacencyList {
public:
    WeightedAdjacencyList() : data() {}
 
    void setEdge(const Vertex &from, const Vertex &to, const Weight weight) {
        data[from][to] = weight;
        data.insert({to, {}});
    }
 
    const Weight &getEdge(const Vertex &from, const Vertex &to) const {
        return data[from][to];
    }
 
    bool removeEdge(const Vertex &from, const Vertex &to) {
        if (!data.contains(from)) {
            return false;
        }
        return data.at(from).erase(to) != 0;
    }
 
    bool hasEdge(const Vertex &from, const Vertex &to) const {
        return data.contains(from) && data.at(from).contains(to);
    }
 
    bool addVertex(const Vertex &vertex) {
        return data.insert(vertex, {});
    }
 
    void removeVertex(const Vertex &vertex) {
        for (auto &v : data) {
            v.second.erase(vertex);
        }
        if (data.contains(vertex)) {
            data.erase(vertex);
        }
    }
 
    std::optional<Weight> operator()(const Vertex &from, const Vertex &to) const {
        if (data.contains(from) && data.at(from).contains(to)) {
            return data.at(from).at(to);
        }
        return {};
    }
 
    const std::unordered_map<Vertex, Weight> &getNeighbours(const Vertex &vertex) const {
        return data.at(vertex);
    }
 
private:
    std::unordered_map<Vertex, std::unordered_map<Vertex, Weight>> data;
};
 
template<typename T>
std::ostream &operator<<(std::ostream &out, const std::optional<T> &optional) {
    if (optional.has_value()) {
        out << "{" << optional.value() << "}";
    } else {
        out << "{NONE}";
    }
    return out;
}
 
template<typename Vertex, typename Weight, typename Callback>
void bfs(const WeightedAdjacencyList<Vertex, Weight> &graph, Vertex start, Callback visit) {
    std::unordered_set<Vertex> visited;
    std::queue<Vertex> queue;
 
    visited.insert(start);
    queue.push(start);
    while (!queue.empty()) {
        Vertex current = queue.front();
        queue.pop();
 
        visit(current);
        for (const auto &v : graph.getNeighbours(current)) {
            if (!visited.contains(v.first)) {
                visited.insert(v.first);
                queue.push(v.first);
            }
        }
    }
}
 
template<typename Vertex, typename Weight>
std::istream &operator>>(std::istream &in, WeightedAdjacencyList<Vertex, Weight> &graph) {
    std::vector<Weight> matrix;
    for (Weight i; in >> i;) {
        matrix.push_back(i);
    }
    size_t vertexCount = std::sqrt(matrix.size()); // ближайший кореньи будет количество вершин
    for (size_t i = 0; i < vertexCount; ++i) {
        for (size_t j = 0; j < vertexCount; ++j) {
            size_t vertexId = i * vertexCount + j;
            if (matrix[vertexId] != 0) {
                graph.setEdge(i, j, matrix[vertexId]);
            }
        }
    }
    return in;
}
 
int main() {
    WeightedAdjacencyList<> a;
 
    std::cin >> a;
 
    bfs(a, 0, [](auto v) { std::cout << v << " ";});
 
    return 0;
}
2
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.05.2024, 21:44
lemegeton, С++ 20 ?
Да этого студента же заклюют, за ересь ))

Плюс, что - то у тебя не пашет.
На моей матрице смежности : 0 1 2 3
Это не обход в ширину.

Добавлено через 4 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
На моей матрице смежности : 0 1 2 3
Похоже, только плюс один.
Слишком простой пример у меня ....

Добавлено через 53 секунды
Тут было бы наглядней из вершины 3.
Плюс разделять переносом строки.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
27.05.2024, 00:01
Цитата Сообщение от SmallEvil Посмотреть сообщение
lemegeton, С++ 20 ?
Да этого студента же заклюют, за ересь ))
Упс. Точно.
Цитата Сообщение от SmallEvil Посмотреть сообщение
Плюс, что - то у тебя не пашет.
На моей матрице смежности : 0 1 2 3
Это не обход в ширину.
Ммм. Не понял.
Что именно не пашет?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
27.05.2024, 00:16
Цитата Сообщение от lemegeton Посмотреть сообщение
Что именно не пашет?
Да всё нормально.
Просто вывод в одну строку обхода в ширину без разделителей, сбивает с толку.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.05.2024, 00:16
Помогаю со студенческими работами здесь

Написать программу, описывающую математическую модель атома
Примерно по этим картинкам

Написать программу, описывающую работу системы на ассемблере
Надо написать программу, описывающую работу системы на ассемблере. Скидываю док файл с описанием системы, помогите начинающему) заранее...

Написать программу, описывающую массив записей – телефонный справочник однокурсников
Помогите переделать 4. Написать программу, описывающую массив записей – телефонный справочник однокурсников – и обеспечивающую ввод...

Написать программу описывающую многогранник (куб) в приборной системе координат
Написать на языке PASCAL программу: 1. Описывающую многогранник (куб) в приборной системе координат. 2. Смещающую его на n пикселов...

Написать программу, описывающую небольшой офис, в котором работают сотрудники – объекты класса Person
Написать программу, описывающую небольшой офис, в котором работают сотрудники – объекты класса Person, обладающие полем имя (Name). Каждый...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru