Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
340.64 Кб
Скачать

Алгоритмы

1) Форд-Беллман

2) Флойд-Уоршелл

3) BFS

4)DFS

5) Алгоритм поиска компонент связности в графе

6) Поиск мостов

7) Поиск точек сочленения

8)Дейкстра

9) Эратосфен

10) Задача о назначениях

11) Алгоритм Куна нахождения наибольшего паросочетания в двудольном графе

12)Эйлер

13) Binpow

14) Расширенный Евклид

15)Длинка

16) Диофантовы уравнения

17) Нахождение степени делителя факториала

18) Дискретное логарифмирование

19) Нахождение площади простого многоугольника

20) Теорема Пика.

21) Пересечение окружности и прямой

22) Поиск общих касательных к двум окружностям

24) Z-функция строки и её вычисление

25) Нахождение всех подпалиндромов --

26) Максимальный подпалиндром --

27) Нахождение наидлиннейшей возрастающей подпоследовательности

28) Динамика по профилю. Задача "паркет"

29) Нахождение наибольшей нулевой подматрицы

30) Гаусс

31) Интеграл по формуле Симпсона –

32) Биномиальные коэффициенты

33) Числа Каталана

34) Ожерелья

35)Задача о ферзях

36)Ханойские башни

37) Правильные скобочные последовательности

38) Принцип включений-исключений

39) Теория Шпрага-Гранди. Ним

40) Оптимальный выбор заданий при известных временах завершения и длительностях выполнения

41) Игра Пятнашки: существование решения

42) Минимальное остовное дерево. Алгоритм Крускала

43) Количество всех остовов графа

44) Гамильтонов цикл

45) Задача о домино

46) Проверка на ацикличность и нахождение цикла

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

48)GCD and LCM

1) Форд-Беллман

struct edge {

int a, b, cost;

};

 

int n, m, v;

vector<edge> e;

const int INF = 1000000000;

 

void solve() {

vector<int> d (n, INF);

d[v] = 0;

for (;;) {

bool any = false;

for (int j=0; j<m; ++j)

if (d[e[j].a] < INF)

if (d[e[j].b] > d[e[j].a] + e[j].cost) {

d[e[j].b] = d[e[j].a] + e[j].cost;

any = true;

}

if (!any) break;

}

// вывод d, например, на экран

}

2) Флойд-Уоршелл

Дан ориентированный или неориентированный взвешенный граф   с   вершинами. Требуется найти значения всех величин   — длины кратчайшего пути из вершины   в вершину  .

Предполагается, что граф не содержит циклов отрицательного веса (тогда ответа между некоторыми парами вершин может просто не существовать — он будет бесконечно маленьким).

for (int k=0; k<n; ++k)

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

for (int j=0; j<n; ++j)

if (d[i][k] < INF && d[k][j] < INF)

d[i][j] = min (d[i][j], d[i][k] + d[k][j]);

3) BFS

В результате поиска в ширину находится путь кратчайшей длины в невзвешенном графе, т.е. путь, содержащий наименьшее число рёбер.

Алгоритм работает за  , где   — число вершин,   — число рёбер.

vector < vector<int> > g; // граф

int n; // число вершин

int s; // стартовая вершина (вершины везде нумеруются с нуля)

queue<int> q;

q.push (s);

vector<bool> used (n);

vector<int> d (n), p (n);

used[s] = true;

p[s] = -1;

while (!q.empty()) {

int v = q.front();

q.pop();

for (size_t i=0; i<g[v].size(); ++i) {

int to = g[v][i];

if (!used[to]) {

used[to] = true;

q.push (to);

d[to] = d[v] + 1;

p[to] = v;

}

}

}

Если теперь надо восстановить и вывести кратчайший путь до какой-то вершины  , это можно сделать следующим образом:

 

if (!used[to])

cout << "No path!";

else {

vector<int> path;

for (int v=to; v!=-1; v=p[v])

path.push_back (v);

reverse (path.begin(), path.end());

cout << "Path: ";

for (size_t i=0; i<path.size(); ++i)

cout << path[i] + 1 << " ";

}

4)DFS

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

vector<bool> used; void dfs(int v) {     used[v] = true;     cout << v;     for (vector<int>::iterator i = g[v].begin(); i != g[v].end(); ++i)         if (!used[*i])             dfs(*i); }

5) Алгоритм поиска компонент связности в графе

Дан неориентированный граф   с   вершинами и   рёбрами. Требуется найти в нём все компоненты связности, т.е. разбить вершины графа на несколько групп так, что внутри одной группы можно дойти от одной вершины до любой другой, а между разными группами — пути не существует.

int n;

vector<int> g[MAXN];

bool used[MAXN];

vector<int> comp;

 

void dfs (int v)

(………………………)

void find_comps() {

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

used[i] = false;

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

if (! used[i]) {

comp.clear();

dfs (i);

 

cout << "Component:";

for (size_t j=0; j<comp.size(); ++j)

cout << ' ' << comp[j];

cout << endl;

}

}

6) Поиск мостов

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

Неформально эта задача ставится следующим образом: требуется найти на заданной карте дорог все "важные" дороги, т.е. такие дороги, что удаление любой из них приведёт к исчезновению пути между какой-то парой городов.

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);

}