我正在解决一个基于n-ary树的简单问题。问题很简单,找到树的每个节点代表士兵的士兵之间握手的总数。只有祖先节点才能握手。
这是2552年,人类刚刚与一个入侵我们太阳系的非常强大的外星种族赢得了一场战争。人类军队正处于庆祝模式!
军队有n名士兵。士兵是从1到n的数字。军队具有优越等级。每个士兵都有一个直接上级。一名士兵的上级也优于那名士兵。所以,一名士兵可能有一名或多名上司,但只有一名上级。
每个士兵都要向其他士兵表示祝贺。对于一对士兵,如果他们中的一个是另一个的优势,他们将握手。否则,他们会碰到拳头。
您将获得所有士兵的直接上级名单。你的工作是告诉那里会有多少握手和拳头撞击。
我的问题是我使用了地图应用了N-ary树概念,其中int
是存储父项和vector of int
作为其子项的关键元素,并应用了DFS但是在第二次迭代后我的值发生了变化,就像:
0 0 | | 3 3 / \ / \ 2 4 2 0 / changes to / 1 1 sample input: 1 // ( test case) 4 // ( number of nodes) 2 3 0 3 // ( parent of node )
由于这个原因,我的代码进入循环(0到3然后是3到0),因此分段错误。我完全搞砸了,尝试了一切,但没有发生任何事情。
这是我的代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
static long long int count1 = 0;
vector<int>::iterator itr;
map<int,vector<int> >tree;
void dfs(map<int,vector<int> > &tree, int node, int height){
if(tree.find(node) == tree.end() ){
return ;
}
if(tree[node].empty()){
return ;
}
for(itr = tree.at(node).begin(); itr != tree.at(node).end(); itr++){
cout<<"node : "<<node <<" child : "<<*itr<<endl;
count1 += height;
dfs(tree,*itr,height+1);
}
}
int main(){
int T,N,X;
cin>>T;
for(int i=0;i<T;i++){
cin>>N;
for(int j=1;j<=N;j++){
cin>>X;
tree[X].push_back(j);
}
dfs(tree,tree[0].front(),1);
cout<<count1<<endl;
count1 -= count1;
tree.clear();
}
return 0;
}
我想知道为什么会这样,我的错在哪里。这种方法有什么问题?我知道还有更多方法,但为什么会失败?