Структура данных, дерево, n-арное дерево, DFS

Я решаю простой вопрос, основанный на n-арном дереве. Вопрос прост, найти общее количество рукопожатий между солдатами, где каждый узел дерева представляет солдат. Только узлы предков могут рукопожатие.

https://www.hackerearth.com/practice/data-structures/trees/binary-and-nary-trees/practice-problems/algorithm/comrades-ii-6/

Это 2552 год, Люди только что выиграли войну против очень могущественной инопланетной расы, которая вторглась в нашу солнечную систему. Человеческая армия находится в режиме празднования!

В армии есть n солдат. Солдаты чисел от 1 до n. Армия имеет иерархию превосходства. У каждого солдата есть один непосредственный начальник. Начальник начальника солдата также является начальником этого солдата. Таким образом, у солдата может быть один или несколько начальников, но только один непосредственный начальник.

Каждый солдат должен поздравить каждого другого солдата. Для пары солдат, если один из них превосходит другого, они пожмут друг другу руки. В противном случае они будут бить кулаками.

Вам дан список непосредственного начальника всех солдат. Ваша задача — сказать, сколько будет рукопожатий и ударов кулаком.

Моя проблема в том, что я применил концепцию N-арного дерева, используя карту где int является ключевым элементом хранения родителя и vector of int будучи его потомком, и применил DFS, но после 2-й итерации мои значения изменяются, например:

0 0
| |
3 3
/ \ / \
2 4 2 0
/                         изменения в          /
1 1

образец ввода:
1 // (контрольный пример)
4 // (количество узлов)
2 3 0 3 // (родитель узла)

и из-за этого мой код переходит в цикл (от 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;
}

Я хотел знать, почему это происходит и где моя вина. В чем проблема в этом подходе? Я знаю, что есть еще много подходов, но почему это терпит неудачу?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]