Дан связный
неориентированный граф без петель и кратных ребер. Разрешается удалять из него
ребра. Требуется получить дерево.
Вход. Первая строка содержит количество
вершин 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)
{
int i;
used[v] = 1;
for(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();
}
}