시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 1024 MB | 1 | 1 | 1 | 100.000% |
Недавно на кружке по программированию Петя узнал об обходе в глубину. Обход в глубину используется во многих алгоритмах на графах. Петя сразу же реализовал обход в глубину на своих любимых языках программирования --- паскале и си.
int a[maxn + 1][maxn + 1]; int visited[maxn + 1]; void dfs(int v) { printf("%d\n", v); visited[v] = 1; for (int i = 1; i <= n; i++) { if ((a[v][i] != 0) && (visited[i] == 0)) { dfs(i); printf("%d\n", v); } } } void graph_dfs() { for (int i = 1; i <= n; i++) { if (visited[i] == 0) { dfs(i); } } }
Петина программа хранит граф с использованием матрицы смежности в массиве <<a>> (вершины графа пронумерованы от 1 до $n$). В массиве <<visited>> помечается, в каких вершинах обход в глубину уже побывал.
Петя запустил процедуру <<graph\_dfs>> для некоторого неориентированного графа $G$ с $n$ вершинами и сохранил ее вывод. А вот сам граф потерялся. Теперь Пете интересно, какое максимальное количество ребер могло быть в графе $G$. Помогите ему выяснить это!
Первая строка входного файла содержит два целых числа: $n$ и $l$ --- количество вершин в графе и количество чисел в выведенной последовательности ($1 \le n \le 300$, $1 \le l \le 2n-1$). Следующие $l$ строк по одному числу --- вывод Петиной программы. Гарантируется, что существует хотя бы один граф, запуск программы Пети на котором приводит к приведенному во входном файле выводу.
На первой строке выходного файла выведите одно число $m$ --- максимальное возможное количество ребер в графе. Следующие $m$ строк должны содержать по два целых числа --- номера вершин, соединенных ребрами. В графе не должно быть петель и кратных ребер.
6 10 1 2 3 2 4 2 1 5 6 5
6 1 2 1 3 1 4 2 3 2 4 5 6