Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТЧЕТ ГРАФЫ.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
46.23 Кб
Скачать

Министерство образования и науки Российской Федерации

ФГБОУ ВПО «Саратовский государственный университет

имени Н. Г. Чернышевского»

Кафедра информатики

и программирования

Теория графов и ее приложения

Отчет

Студента 2 курса 211 группы

дневного отделения

факультета КНиИТ

Сенина Михаила Михайловича

Проверила Огнева М. В.

Саратов, 2013 г

Содержание

Графы 3

Задача 1 3

Задача 2 4

Задача 3 7

Топологическая сортировка 9

Алгоритм Флойда 10

Стек и очередь 11

Очередь 11

Стек 12

Деревья 14

Дерево бинарного поиска 14

Идеально-сбалансированное дерево 16

Графы.

Задача 1.

Удалить вершину из графа.

#include <fstream>

#include <iostream>

#include <algorithm>

#include <vector>

#include <string>

#include <sstream>

using namespace std;

ifstream in("input.txt");

ofstream out("output.txt");

int main(){

int n, peak, temp;

in>>n;

in.get();

in>>peak;

in.get();

vector <vector <int>> vec(n);

string str;

for (int i=0; i<n; i++){

std::stringstream s;

getline(in,str);

s<<str;

while (s>>temp)

vec[i].push_back(temp);

}

for (int i=0; i<vec.size(); i++){

vector <int>::iterator itend = remove(vec[i].begin(),vec[i].end(),peak);

vec[i].erase(itend,vec[i].end());

}

vec.erase(vec.begin() + peak-1);

for (int i=0;i<vec.size();i++){

for (int j=0; j<vec[i].size(); j++)

out<<vec[i][j]<<' ';

out<<'\n';

}

return 0;

}

Задача 2.

Проверить существует ли путь из вершины а в б при удалении трех ребер.

#include <iostream>

#include <fstream>

#include <sstream>

#include <vector>

#include <string>

#include <algorithm>

using namespace std;

bool proverka(vector <vector <int> > vec, int b) {

for (unsigned i = 0; i < vec.size(); i++) {

if (vec[i][1] == b) {

return 1;

}

}

return 0;

}

bool test(vector <vector <int> > vec, int a, int b, int c) {

int k = 0;

bool flag;

for (unsigned i = 0; i < vec.size(); i++) {

flag = true;

for (unsigned j = 0; j < vec[i].size() && flag; j++) {

if (vec[i][j] == a || vec[i][j] == b || vec[i][j] == c) {

k++;

flag = false;

}

}

}

if (k == vec.size()) {

return 1;

} else {

return 0;

}

}

void main() {

ifstream in("input.txt");

ofstream out("output.txt");

int a, b, n, x, x1, k = 0;

bool flag = false, flag1;

string s;

in >> n;

in.get();

vector <vector <int> > vec(n, vector<int>(0));

for (int i = 0; i < n; i++) {

getline(in, s);

stringstream ss(s);

ss >> x >> x1;

vec[i].push_back(x);

vec[i].push_back(x1);

}

in >> a >> b;

if (a == b) {

out << "вершина а равна вершине б, введите другие значения а и б";

}

else {

for (unsigned i = 0; i < vec.size(); i++) {

if (vec[i][1] == b) {

flag = true;

k++;

}

}

if (flag) {

vector <vector <int> > put(k, vector<int>(0));

vector <int> rebra;

k = 0;

for (unsigned i = 0; i < vec.size(); i++) {

if (vec[i][1] == b) {

put[k].push_back(i);

flag = true;

while (proverka(vec, vec[put[k][put[k].size() - 1]][0])) {

flag = true;

for (unsigned i = 0; i < vec.size() && flag; i++) {

if (vec[i][1] == vec[put[k][put[k].size() - 1]][0]) {

put[k].push_back(i);

flag = false;

}

}

}

k++;

}

}

out << "Пути от вершины а к вершине б. Указаны номера ребер.\n";

for (unsigned i = 0; i < put.size(); i++, out << endl) {

for (unsigned j = 0; j < put[i].size(); j++) {

out << put[i][j] << " ";

}

}

for (unsigned i = 0; i < put.size(); i++) {

for (unsigned j = 0; j < put[i].size(); j++) {

rebra.push_back(put[i][j]);

}

}

for (vector <int>::iterator iter = rebra.begin(); iter < rebra.end(); iter++) {

vector <int>::iterator iEnd = remove(iter + 1, rebra.end(), *iter);

rebra.erase(iEnd, rebra.end());

}

if (rebra.size() < 3) {

out << "\nНельзя удалить 3 ребра.";

} else if (rebra.size() == 3) {

out << "\nУдалив все 3 ребра мы не попадем из вершины а в вершину б";

} else {

flag = false;

out << "\n\n\n";

for (unsigned i = 0; i < rebra.size() - 2; i++) {

for (unsigned j = i + 1; j < rebra.size() - 1; j++) {

for (unsigned k = j + 1; k < rebra.size(); k++) {

if (test(put, rebra[i], rebra[j], rebra[k])) {

flag = true;

out << rebra[i] << "," << rebra[j] << "," << rebra[k] << "\n";

}

}

}

}

if (!flag) {

out << "Нельзя удалить 3 ребра так, чтобы нельзя было попасть из вершины а в вершину б.";

}

}

} else {

out << "нет вершины а, или из неё ни что не выходит";

}

}

in.close();

out.close();

system("pause");

}

Задача 3.

Проверить, является ли заданный орграф ацикличным.

#include <iostream>

#include <vector>

#include <algorithm>

#include <iomanip>

#define forn(i, n) for(int i = 0; i < n; i++)

#define vect vector

using namespace std;

vect <vect <int>> Graf;

vect <int> used;

bool dfs(int v)

{

used[v]++;

forn(i, Graf[v].size())

{

if(used[Graf[v][i]] < 2)

{

dfs(Graf[v][i]);

}

else

{

return false;

}

}

return true;

}