Я делаю задачу на соревнованиях ACM, чтобы определить количество связанных компонентов, имеющих неориентированный граф G и вершины, принадлежащие каждому компоненту. Уже сделано с алгоритмом DFS, подсчитывающим количество связанных компонентов неориентированного графа (сложная часть проблемы), но я не могу придумать, что указывать узлы, принадлежащие каждому компоненту, или иметь запись узлов. 1001 *
Ввод: Первой строкой ввода будет целое число 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;
}
У меня есть сомнения по поводу того, как переносить память узлов, принадлежащих каждому подключенному компоненту или структуре, для хранения, как я должен изменить свой код для этого ?, Я хотел бы услышать предложения, идеи или любую реализацию в псевдокод. Спасибо всем