Разработать какой-либо порядок закрытия станций, при котором метро всегда будет оставаться связным

Условие:
По введенной информации о сети метро разработать какой-либо порядок закрытия станций, при котором метро всегда будет оставаться связным. Например, пусть метро выглядит так, как показано в примере ввода. Тогда станции можно закрывать, например, в порядке 1,2,4,3,5. А порядок 3,1,2,4,5 – не подходит, так как после закрытия 3-й станции метро распадется на четыре не связных части.
Первая строка входного файла будет содержать числа N и M. В следующих M строках находится информация о линиях. Каждая из этих строк содержит через пробел числа Ai и Bi – две станции, которые соединяет i-я линия. Выходной файл должен состоять из N строк. Каждая строка должна содержать одно число – номер станции. Вывести станции нужно в порядке их закрытия.
Пример ввода
5 4
3 1
3 2
3 4
3 5

Пример вывода
1
2
4
3
5

Вот код, который смог написать.

#include <iostream>
using namespace std;

const int MaxN = 1000,
MaxP = 5000;

int i, j, N, P;
int pre[MaxN], rang[MaxN], color[MaxN];
int B[MaxP], E[MaxP];
int R[MaxP], kG[MaxN], G[MaxN][MaxN];
FILE* file;

void Input()
{
    file = fopen("input.txt", "r");
    fscanf(file, "%d %d", &N, &P);
    for (i = 1; i <= P; i++)
    {
        fscanf(file, "%d %d", &B[i], &E[i]);
        R[i] = 1;
    }
    fclose(file);
}

void MakeSet(int x)
{
    rang[x] = 0;
    pre[x] = x;
}

int FindSet(int x)
{
    int z;
    if (x != pre[x])
        pre[x] = FindSet(pre[x]);
    z = pre[x];
    return z;
}

void Link(int x, int y)
{
    if (rang[x] > rang[y])
        pre[y] = x;
    else
    {
        pre[x] = y;
        if (rang[x] == rang[y])
            rang[y]++;
    }
}

void Union(int x, int y)
{
    Link(FindSet(x), FindSet(y));
}

void MinTreeKruskal()
{
    for (i = 1; i <= N; i++)
        kG[i] = 0;
    for (i = 1; i <= N; i++)
        MakeSet(i);
    for (i = 1; i <= P; i++)
        if (FindSet(B[i]) != FindSet(E[i]))
        {
            kG[B[i]]++; G[B[i]][kG[B[i]]];
            kG[E[i]]++; G[E[i]][kG[E[i]]];
            Union(B[i], E[i]);
        }
}

void DFS(int u)
{
    int j;
    color[u] = 1;
    for (j = 1; j <= kG[u]; j++)
        if (color[G[u][j]] == 0)
            DFS(G[u][j]);
    cout << u << endl;
}

int main()
{
    Input();
    MinTreeKruskal();
    for (i = 1; i <= N; i++)
        color[i] = 0;
    DFS(1);
    system("pause");
}

Проблема в том, что программа выводит только числа 0 и 1.


Ответы (0 шт):