You are on page 1of 9

Міністерство освіти і науки України

Національний технічний університет України «Київський політехнічний інститут


імені Ігоря Сікорського"
Факультет інформатики та обчислювальної техніки

Кафедра ІПІ

Звіт

з лабораторної роботи №4 з дисципліни


“Алгоритми та структури даних 2. Структури даних”

“Прикладні задачі теорії графів”

Виконав: ІП-21 Бойко Борис Дмитрович


Перевірила: Халус Олена Андріївна

Київ 2023
Мета роботи – вивчити основні прикладні алгоритми на графах
та способи їх імплементації.
Опис практичного завдання:

Виконання
3.1 Псевдокод алгоритму
3.2 Програмна реалізація алгоритму
void bfs(int start, Graph& _graph)
{
vector<bool> visited(_graph.adj.size(), false);
vector<int> q;
q.push_back(start);

// Set source as visited


visited[start] = true;

int vis;
cout<<"\nResult:[";
while (!q.empty()) {
vis = q[0];

// Print the current node


cout << vis << " ";
q.erase(q.begin());

// For every adjacent vertex to the current vertex


for (int i = 0; i < _graph.adj[vis].size(); i++) {
if (_graph.adj[vis][i] == 1 && (!visited[i])) {
q.push_back(i);
visited[i] = true;
}
}
}
cout<<"]";
}
3.2.1. Вихідний код

Graph.h
#ifndef LAB_ASD_GRAPH_4_GRAPH_H
#define LAB_ASD_GRAPH_4_GRAPH_H

#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<random>

using namespace std;

class Graph {
int v;
vector<vector<int>> adj;
public:
Graph(int);
Graph();
void addEdge(int,int);
friend void bfs(int,Graph&);
friend ostream& operator<<(ostream&, const Graph&);
};

#endif //LAB_ASD_GRAPH_4_GRAPH_H
Graph.cpp
#include "Graph.h"

Graph::Graph(int vertises)
{
v = vertises;
adj = vector<vector<int>>(v, vector<int>(v, 0));
}
Graph::Graph() {
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<int> dist(0,1);
uniform_int_distribution<int> dist1(7,16);
v=dist1(gen);
adj = vector<vector<int>>(v, vector<int>(v, 0));
for (int i = 0; i < v; ++i) {
for (int j = 1; j < v; ++j) {
if(dist(gen)==1) {
addEdge(i,j);
}
}
}
}
void Graph::addEdge(int x,int y)
{
adj[x][y] = 1;
adj[y][x] = 1;
}
ostream& operator<<(ostream& os, const Graph& _graph) {
os<<setw(3)<<" ";
for (int i = 0; i < _graph.v; ++i) {
os<<setw(3)<<i<<" ";
}
os<<endl;
for (int i = 0; i < _graph.v; ++i) {
os<<setw(3)<<i<<" ";
for (int j = 0; j < _graph.v; ++j) {
os<<setw(3)<<_graph.adj[i][j]<<" ";
}
os<<endl;
}
return os;
}
// Function to perform BFS on the graph
void bfs(int start, Graph& _graph)
{
vector<bool> visited(_graph.adj.size(), false);
vector<int> q;
q.push_back(start);

// Set source as visited


visited[start] = true;

int vis;
cout<<"\nResult:[";
while (!q.empty()) {
vis = q[0];

// Print the current node


cout << vis << " ";
q.erase(q.begin());

// For every adjacent vertex to the current vertex


for (int i = 0; i < _graph.adj[vis].size(); i++) {
if (_graph.adj[vis][i] == 1 && (!visited[i])) {
q.push_back(i);
visited[i] = true;
}
}
}
cout<<"]";
}
3.3 Приклад роботи

Рис 3.3.1 Граф з 7-ма вершинами

Рис 3.3.2 Граф з 15-ма вершинами


3.4 Ручне розв’язання задачі
Висновок: під час виконання даної лабораторної роботи я реалізував алгоритм пошуку в
ширини для неорієнтованого незваженого графа. Часова складність реалізації на базі матриці
суміжності становить О(n*n). При використанні списку суміжності можна досягти зменшення
часової складності до О(v+e), де v - це кількість вершин графа, а е - кількість його ребер.
Алгоритм пошуку в ширину є оптимальним лише за умови рівнозваженості графа.

You might also like