Дан связный
неориентированный граф без петель и кратных ребер. Разрешается удалять из него
ребра. Требуется получить дерево.
Вход. Первая строка содержит два целых числа – количество
вершин n (1 ≤ n ≤ 100) и количество ребер m в графе. Далее следуют m пар целых
чисел, каждая из которых задаёт одно ребро. Гарантируется, что граф связный.
Выход. Выведите n – 1 пару чисел – ребра, входящие в дерево. Ребра
можно выводить в любом порядке.
Пример
входа |
Пример
выхода |
4 4 1 2 2 3 3 4 4 1 |
1 2 2 3 3 4 |
графы –
поиск в глубину
Анализ алгоритма
Выполним поиск в
глубину, начиная с первой вершины. Строим дерево поиска в глубину и выводим все
его ребра.
Пример
Граф,
приведенный в примере, имеет вид:
При запуске поиска в
глубину из вершины 1 обход пройдёт по рёбрам: (1, 2), (2, 3),
(3, 4).
Реализация алгоритма
Матрицу смежности графа храним в массиве g.
#define MAX 101
int g[MAX][MAX], used[MAX];
Функция dfs выполняет
поиск в глубину, начиная с вершины v. Выводим каждое ребро (v, i),
входящее в дерево поиска в
глубину.
void dfs(int
v)
{
used[v] = 1;
for (int i = 1; i <= n; i++)
if (g[v][i]
&& !used[i])
{
printf("%d
%d\n",v,i);
dfs(i);
}
}
Основная часть программы. Читаем
входные данные.
scanf("%d %d",&n,&m);
memset(g,0,sizeof(g)); memset(used,0,sizeof(used));
while(m--)
{
scanf("%d
%d",&a,&b);
g[a][b] = g[b][a] = 1;
}
Запускаем поиск в глубину из первой
вершины.
dfs(1);
Java реализация
import java.util.*;
public class Main
{
static int g[][],
used[];
static int n, m;
static void dfs(int v)
{
used[v] =
1;
for(int i = 1;
i <= n; i++)
if (g[v][i] ==
1 && used[i] ==
0)
{
System.out.println(v + "
" + i);
dfs(i);
}
used[v] =
2;
}
public static void
main(String[] args)
{
Scanner con = new
Scanner(System.in);
n = con.nextInt();
m = con.nextInt();
g = new int[n+1][n+1];
used = new int[n+1];
for(int i = 0;
i < m; i++)
{
int a = con.nextInt();
int b = con.nextInt();
g[a][b] = g[b][a] =
1;
}
dfs(1);
con.close();
}
}