Разработать какой-либо порядок закрытия станций, при котором метро всегда будет оставаться связным
Условие:
По введенной информации о сети метро разработать какой-либо порядок закрытия станций, при котором метро всегда будет оставаться связным. Например, пусть метро выглядит так, как показано в примере ввода. Тогда станции можно закрывать, например, в порядке 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.