978. Получи дерево

 

Дан связный неориентированный граф без петель и кратных ребер. Разрешается удалять из него ребра. Требуется получить дерево.

 

Вход. Первая строка содержит количество вершин 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();

  }

}