0

I'm trying to implement the program which can return all the connected parts of a scattered graph as a 2D vector array.

here is the code i wrote :

    #include <bits/stdc++.h>
using namespace std;
typedef long long int ll;

void checkConnected(int** edges, int n, int s,int* visited, vector<int> &v) {
    v.push_back(s);
    visited[s] = 1;
    for(int i=0; i<n; i++) {
        if(s == i) {
            continue;
        }
        if(!visited[i] && edges[s][i] == 1) {
            checkConnected(edges,n,i,visited,v);
        } 
    }
}

void returnAllConnected(int** edges, int n, int st ,vector<vector<int>> &ans, int* visited) {
    vector<int> v;
    checkConnected(edges,n,st,visited,v);
    ans.push_back(v);
    v.clear();
    for(int i=0; i<n; i++) {
        if(visited[i] == 0) {
            returnAllConnected(edges,n,i,ans,visited);
            break;
        }
    }
}

int main() {
    int n,e;
    cin>>n>>e;
    int** edges = new int*[n];
    for(int i=0; i<n; i++) {
        edges[i] = new int[n];
        for(int j=0; j<n; j++) {
            edges[i][j] = 0;
        }
    }
    int s,d,w;
    for(int i=0; i<e; i++) {
        cin>>s>>d>>w;
        edges[s][d] = w;
        edges[d][s] = w;
    }
    
    int* visited = new int[n];
    for(int i=0; i<n; i++) {
        visited[i] = 0;
    }
    
    vector<vector<int>> ans;
    returnAllConnected(edges,n,0,ans,visited);
    
    for(int i=0; i<ans.size(); i++) {
        for(int j=0; j<ans[i].size(); j++) {
            cout<<ans[i][j]<<" "; 
        }
        cout<<endl;
    }
    
    for(int i=0; i<n; i++) {
        delete[] edges[i];
    }
    delete[] edges;
    delete[] visited;
    return 0;
}

the output coming is this:

0 
1 
2 
3 
4 
5 
6

Please help me out figuring what i did wrong. the output should have been something like this.

0 1
2 3
4 5 6

The input i gave:

7 4
0 1
2 3
4 5
5 6
Evg
  • 25,259
  • 5
  • 41
  • 83

1 Answers1

0

returnAllConnected should not be recursive

Something like this should work

void returnAllConnected(int** edges, int n, int st ,vector<vector<int>> &ans, int* visited) {
    for(int i=0; i<n; i++) {
        if(visited[i] == 0) {
              vector<int> v;
              checkConnected(edges,n,st,visited,v);
              ans.push_back(v);
        }    
    }
}
ravenspoint
  • 19,093
  • 6
  • 57
  • 103