
Министерство образования и науки Российской Федерации
ФГБОУ ВПО «Саратовский государственный университет
имени Н. Г. Чернышевского»
Кафедра информатики
и программирования
Теория графов и ее приложения
Отчет
Студента 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;
}