DFS: Как указать узлы связанных компонентов в C ++

Я делаю задачу соревнований ACM, чтобы определить количество связанных компонентов, которые имеют неориентированный граф G и вершины, принадлежащие каждому компоненту. Я уже сделал с алгоритмом DFS, подсчитывая количество связанных компонентов неориентированного графа (сложная часть проблемы), но я не могу придумать ничего, чтобы указать узлы, принадлежащие каждому компоненту, или иметь запись узлов.

Входные данные: В первой строке входных данных будет целое число C, которое указывает количество тестовых примеров.Первая строка каждого тестового примера содержит два целых числа N и E, где N представляет количество узлов в графе, а E - количество ребер в нем. Затем следуют E строк, каждая из которых содержит 2 целых числа I и J, где I и J представляют существование ребра между узлом I и узлом J (0 ≤ I, J

Вывод: В первой строке каждого тестового примера должна отображаться следующая строка «Вариант G: P подключенных компонентов», где G представляет собой количество тестовых примеров (начиная с 1), а P - количество компонентов. соединены в графе. Затем X строк, каждая из которых содержит узлы, принадлежащие соединенному компоненту (в порядке от наименьшего к наибольшему), разделенные пробелами. После каждого тестового примера следует вывести пустую строку. Результат должен быть записан в «output.out».

Пример:

Вход:

2
6 9
0 1
0 2
1 2
5 4
3 1
2 4
2 5
3 4
3 5
8 7
0 1
2 1
2 0
3 4
4 5
5 3
7 6

Выход:

Case 1: 1 component (s) connected (s)
0 1 2 3 4 5

Case 2: 3 component (s) connected (s)
0 1 2
3 4 5
6 7

Вот мой код:

#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <string.h>
using namespace std;
vector<int> adjacency[10000];
bool visited[10000];

/// @param Standard algorithm DFS
void dfs(int u){
    visited[ u ] = true;
    for( int v = 0 ; v < adjacency[u].size(); ++v ){
        if( !visited[ adjacency[u][v] ] ){
            dfs( adjacency[u][v] );
        }
    }
}

    int main(int argc, char *argv []){
    #ifndef ONLINE_JUDGE
    #pragma warning(disable: 4996)
        freopen("input.in", "r", stdin);
            freopen("output.out", "w", stdout);
    #endif

         ///enumerate vertices from 1 to vertex
        int vertex, edges , originNode ,destinationNode, i, j,cont =1;
        ///number of test cases
        int testCases;
        int totalComponents;
        scanf ("%d", &testCases);

        for (i=0; i<testCases; i++){

        memset( visited , 0 , sizeof( visited ) );
        scanf("%d %d" , &vertex , &edges );
        for (j=0; j<edges; j++){
            scanf("%d %d" , &originNode ,&destinationNode );
            adjacency[ originNode ].push_back( destinationNode );
            adjacency[ destinationNode ].push_back( originNode );
        }
            totalComponents =0;
            for( int i = 0 ; i < vertex ; ++i ){    // Loop through all possible vertex
                if( !visited[ i ] ){          //if we have not visited any one component from that node
                    dfs( i );                  //we travel from node i the entire graph is formed
                    totalComponents++;                   //increased amount of components
                }
            }
            printf("Case %d: %d component (s) connected (s)\n" ,cont++, totalComponents);

            for (j=0;j<total;j++){
        /*here should indicate the vertices of each connected component*/
    }
        memset( adjacency , 0 , sizeof( adjacency ) );
        }
    return 0;
    }

У меня есть сомнения относительно того, как нести память узлов, принадлежащих каждому подключенному компоненту или структура должна использоваться для хранения, как мне изменить свой код для этого? Я хотел бы услышать предложения, идеи или любую реализацию в псевдокоде. Спасибо всем

5
задан iCodez 22 January 2015 в 00:11
поделиться