Codeforces Round 360 (Div. 1) |
---|
Закончено |
Сегодня Пари задала Арию интересную графовую задачу. Арий написал неоптимальное решение, потому что верит, что может протолкнуть неоптимальное решение в любой задаче. Но его решение не только не оптимальное, оно ещё и содержит ошибки, а поскольку Арий долго пытался его оптимизировать, то код стал совсем «грязным». Арий продолжал получать вердикт Time Limit Exceeded и совсем уже расстроился, когда ему в голову пришла прекрасная идея!
Вот так выглядит сейчас его код:
dfs(v)
{
set count[v] = count[v] + 1
if(count[v] < 1000)
{
foreach u in neighbors[v]
{
if(visited[u] is equal to false)
{
dfs(u)
}
break
}
}
set visited[v] = true
}
main()
{
input the digraph()
TOF()
foreach 1<=i<=n
{
set count[i] = 0 , visited[i] = false
}
foreach 1 <= v <= n
{
if(visited[v] is equal to false)
{
dfs(v)
}
}
... // And do something cool and magical but we can't tell you what!
}
Арий просит вас написать функцию TOF, которая будет уменьшать количество вызовов функции dfs. На вход подаётся ориентированный граф, и функция TOF должна переставить каким-то образом рёбра графа, то есть изменить порядок вершин в списке смежности neighbors каждой вершины. Количество вызовов функции dfs, разумеется, зависит от того, какой порядок для вершин в neighbors выбрать.
В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 5000) — количество вершин и количество ориентированных рёбер во входном графе.
В каждой из последующих m строк записана пара целых чисел ui и vi (1 ≤ ui, vi ≤ n), означающая, что во входном графе существует ориентированное ребро .
Гарантируется, что в графе нет петель и что каждая неупорядоченная пара вершин соединена не более чем одним ориентированным ребром.
Выведите единственное целое число — минимальное возможно количество вызовов функции dfs, которого можно достигнуть, переставив правильно рёбра.
3 3
1 2
2 3
3 1
2998
6 7
1 2
2 3
3 1
3 4
4 5
5 6
6 4
3001
Название |
---|