0

我正在尝试实现可以​​将散点图的所有连接部分作为二维向量数组返回的程序。

这是我写的代码:

    #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;
}

输出是这样的:

0 
1 
2 
3 
4 
5 
6

请帮我弄清楚我做错了什么。输出应该是这样的。

0 1
2 3
4 5 6

我给的输入:

7 4
0 1
2 3
4 5
5 6
4

1 回答 1

0

returnAllConnected 不应该是递归的

像这样的东西应该工作

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);
        }    
    }
}
于 2021-07-27T13:49:20.730 回答