1

(9 ответов, оставленных в Algo)

ivank пишет:

Если просто сосчитать - то динамическим программированием.

Если же вывести - то перебором. Не забывайте отсекать перебор, как только из текущей вершины нельзя попасть в конечную - тогда сложность перебора будет O(nk), где k = число путей (может быть экспоненциально большим)

А как ДП прикрутить для подсчета путей?

Вывод всех путей уже реализовал с помощью одного запуска DFS без пометок.

2

(9 ответов, оставленных в Algo)

Спасибо)

3

(9 ответов, оставленных в Algo)

Дан ориентированный связанный граф без циклов.
Как найти количество различных путей от вершины s в вершину t? и вывести их(все пути).

например дан граф:
4 - вершины
5 - ребер

1 4
1 2
1 3
2 4
3 4

Пусть s = 1, а t = 4, тогда кол-во путей различных будет 3и, это:
1 - 2 - 4
1 - 4
1 - 3 - 4


Пытался обходом в ширину найти, когда из любой другой вершины выходим на t тогда выписываем путь, но в этом случае может оказаться что смежные вершины могут уже быть помеченными, а если вообще не помечать то плохо получается((

4

(12 ответов, оставленных в OlympNews)

Круто, воще молодцы, от других стран вроде только по одному человеку в финале будет))
УДАЧИ на финале!)

5

(13 ответов, оставленных в Algo)

http://informatics.mccme.ru/moodle/mod/ … php?id=290 - объяснения, обратите внимание на левую колонку.

http://informatics.mccme.ru/moodle/mod/ … php?id=477 - 5 задач на эту тему.

http://informatics.mccme.ru/moodle/mod/ … php?id=489 - разбор задач.

6

(10 ответов, оставленных в Offtopic)

уточнение:
Если граф связан(существует путь между двумя любыми вершинами) и E = V - 1, то данный граф является деревом.

Ну лично для меня олимпиадное программирование -- это только ради диплома на всеросе и радости от придуманного алгоритма : ) Вообще, я, видимо, после всероса 2010 вообще забью на такого рода проганье, ибо уже задолбало нереалне имхо % )
Кстати, как считаете, вот с таким подходом к жизни, куда стоит идти -- на ВМК МГУ или на МехМат МГУ?

Лично для меня как для нуба, спортивное программирование(СП) увлекательное интересное занятие, и я сам по себе.

С точки зрения такого подхода:
имхо куда бы вы не поступили, все равно будете заниматься тем чем вам угодно, поэтому я считаю что лучше не тратить время, и сразу идти туда куда хочется.

С точки зрения престижности:
Тогда поступать надо в МГУ)

7

(5 ответов, оставленных в Problems)

Идея в том что нижняя строка постоянно увеличивается на число которое увеличивается на единицу
то есть
1 3 6 10 15 21 ...
+2 +3 +4 +5 +6 ....
вот этот возрастающий ряд сравниваю с введенным n, как только элемент ряда становится равным или больше n значит можно теперь высчитать координаты.

#include <iostream>
using namespace std;
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int n = 0;
    scanf("%d",&n);
    if(n == 1){ printf("x = 1 y = 1"); return 0;}
    int iter = 1;
    for(int i = 2; ;i++){
        iter += i;
        if(iter >= n){
            int d = iter - n;
            printf("х = %d y = %d",i-d,d+1);//высчитываю координаты
            return 0;
        }
    }
    return 0;
}
это решение за O(sqrt(n)), и тут где-то ошибка.

Номер диагонали можно не циклом вычислять как у меня а решив уравнение

KADR:
n*(n+1)<=a*2
n^2+n-a*2<=0

тогда цикл вообще не нужен, решение будет за O(1).

8

(10 ответов, оставленных в Offtopic)

2rf пишет:

Вообще-то просто E = V - 1;

Точно, спасибо, я просто со старого кода списывал, а там видимо ребро за два считалось как то вот и поделил на два;)

Еще интересные штучки из старого архива сайта e-maxx:
1. CTRL+SHIFT+8 в Visual Studio.
2. Зарегистрировать тип(чтоб подсвечивался как int,char... ) файл usertype.dat добавить в \Microsoft Visual Studio 8\Common7\IDE, в файле в каждой строе должна быть одна запись(например можно заставить светиться string)).

9

(10 ответов, оставленных в Offtopic)

Всем привет! Я начинающий "спортивный программист" поэтому не очень сильно шарю в алгоритмах.
Захотелось определить приоритеты изучения алгоритмов(обучаюсь самостоятельно), пожалуйста помогите мне.
   
Начальный знания:
#include С++, STL, некоторые простые алгоритмы, математика(школьный уровень).

И так я начну (по убыванию приоритета){
0 = математика(){
    0.2 = Факторизация числа;
    0.3 = Расширенный алгоритм Евклида[НОД,НОК,обратный элемент];
}
1 = Длинная арифметика ;
2 = Комбинаторика(){
    2.1 =  коэффициент Сnm;
    2.2 =  генерация перестановок;
}
3 =  Геометрия(){
     3.1 = Теорема Пифагора[с отрезками];
     3.2 = Теорема синусов, косинусов[с треугольниками];
}
4 =  Алгоритмы на графах(){
     4.1 = Поиск в ширину == волновой алгоритм == BFS;
     4.2 = Поиск в глубину == DFS;
     4.3 = Максимальный поток[метод Эдмондса-Карпа];
     4.4 = Нахождение каркаса графа[Крускал,Прима];
     4.5 = ...;
}
5 = Алгоритмы на строках(){
    5.1 = быстрый поиск подстроки с использование хэш + дерево сумм;
}
6 = Динамическое программирование(){
   6.1 = нахождение способов замощения области;
   6.2 = нахождение способов замощения области по маски;
}
7 = Жадное программирование[это уже "врожденное" умение программировать];
8 = Структуры данных(){
     8.1 = хэш;
     8.1 = двоичное дерево;
     8.2 = дерево максимум/минимумов/сумм;
     8.3 = система не пересекающихся множеств[как подзадача других задач];
     8.4 = сбалансированные деревья АВЛ, красно-черное;
     8.4 = ...;
}
9 = ....;
}

Еще хочется побольше знать вещей на подобии:
1. Хэш-таблицы реализованы в STL hash_map,hash_set.
2. Множестве set в STL есть сбалансированное красно-черное дерево.
3. Длинная арифметика реализована в Java ее можно использовать на соревнованиях.
4. Граф является деревом если E == V - 1, где E - кол-во ребер, V - кол-во вершин.
5. Количество делителей числа равно произведению степеней простых множителей числа увеличенных на единицу.
6. %i - оказывается пытается распознать системы счисления числа.
7. Для определения количества способов замостить область фигурками 2х1 можно использовать мак. пар(узнал с этого форума).
8. Вывод вектора:

vector<any_type> a(5,0);
cout << a;  //выведет {0,0,0,0,0}

если предварительно описать:

template<class T>
ostream& operator<<(ostream& out, const vector<T> a){/
out << "{";
if(!a.empty()) out << a[0];
for(int i = 1; i < (int)a.size(); i++)   out << ", " << a[i];
out << "}";
return out;
}

9. При перемножении элементов массива тип который long long нужно использовать 1ll чтоб при перемножении числа не воспринимались как int(узнал с этого форума)

 long long a[3] = {121111111,1111111111,0};
a[2] = a[0]*1ll*a[1];

P.S.
Это то что для меня кажется "хитростями", для кого-то покажется ерундой. Но я думаю у Вас все равно есть знания которые для Вас кажутся "хитрыми", поделитесь ими.

P.P.S.
Не сомневайтесь умные книги я тоже читаю(все лето читал) и продолжаю читать:)

10

(3 ответов, оставленных в Problems)

если задан прямоугольный массив MxN, это ведь и есть прямоугольная область(ПО) данного массива?
тогда ответом будет ПО  MXN? а сумму можно найти за O(MN)!