如何计算图中所有节点的总和?

时间:2019-01-05 11:30:54

标签: graph

我是DFS的新手,在尝试在DFS上做某事时,这是我尝试编写的程序。想法是计算以节点1为根的子树的所有节点的总和。 这个想法是创建一个函数dfs(node),使其存储以'node'为根的子树的节点的值之和。当parent == child时,我确保循环停止(否则将进行无限递归)。

程序无法编译。

代码(Idone:https://ideone.com/ntS9AG):

#include<bits/stdc++.h>
using namespace std;
#define ff(i,ii,jj) for(int i=ii; i<=jj; i++)

    int n;
    int val[10000];
    vector<int> adj(10000); // adj.size() compiles correctly when adj[10000] is written; won't that create columns instead of rows?
    int sum[10000];
    bool visited[10000];

    void dfs(int node)
    {

        if (!visited[node])
        {
            sum[node]+=val[node];
            visited[node]=true;
            for (int i=0; i<adj[node].size(); i++)
            {
                if (!visited[adj[node][i]]) {visited[adj[node][i]]=true; dfs(adj[node][i]); sum[node]+=sum[adj[node][i]];}
            }
        }
    }

int main()
{
    memset(sum,0,sizeof(sum));
    memset(visited, false, sizeof(visited));
    cin>>n;
    for (int i=1; i<=n-1; i++) {int x,y; cin>>x>>y; adj[x].push_back[y]; adj[y].push_back[x];}
    for (int i=1; i<=n; i++) cin>>val[i];
    dfs(1);

    cout<<sum[1];
}

P.S。 :该程序只是在DFS上写一些东西,因此我尝试进行递归。我当然知道我可以只对输入值求和。

1 个答案:

答案 0 :(得分:0)

vector v(n)创建大小为n的向量。基本上,您只有一个向量。

但是,当您编写vector v [n]时,它会生成 n 个向量,这是您尝试实现邻接表时应该执行的操作。

考虑此图: Directed Garph

因此,您的邻接列表如下

TabStack2

很明显,您可以看到需要5个向量才能使用邻接表存储此图。这就是为什么您需要以其他方式定义图形的原因。 (您在评论中的书写方式)。