1004 Counting Leaves (30 分)c++實現
阿新 • • 發佈:2018-11-03
題目
https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184
解題思路與程式碼實現
思路1:
構建一個結構體,包含三個元素,id,是否有孩子, 層級
構建一個數組維護樹結構
讀取元素以及其孩子,對其孩子id對應的陣列位置的level進行更新,為本節點+1
讀取完資料後, 按照level對陣列遍歷, 對!has_child的本level進行累加
遇到的問題:
-
如何將01這樣的兩位編號合適的轉化為int型別
讀取一個char[3]的陣列用atoi(char*) 函式轉為int
如果只是使用int值, 直接用int變數去接收cin的傳參,如果希望使用char和int, 則按照上面的方法 -
打亂ID的順序, 例如兒子在雙親前, 會導致level錯誤(此時雙親的level為0)
測試點1,3相關 -
對ID不連續敏感,但題目並沒有保證ID的連續性(通過加used並沒有減少未通過項,證明不是連續敏感的問題)
可能的解決辦法: 先建樹再計層數
思路2:
1 3 測試點過不去, 問題最可能出現在2上,若給定順序不一樣
先將節點資訊存起來, 再從根開始向下找,這就是為什麼網上的一些程式碼是使用DFS或BFS的構建一個結構體, 儲存節點的子節點
從根節點按照DFS遍歷樹
/***********************************
思路1 測試點1 3 過不去
************************************/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Node {
bool has_child;
int level;
bool used;
};
int main()
{
int N, M, tree_level = 0;
cin >> N;
if (N == 0) return 0;
cin >> M;
vector<Node> tree(N + 1); // tree[0] is abondon.
for (int i = 0; i < tree.size(); i++) {
tree[i].has_child = false;
tree[i].used = false;
}
tree[1].level = 0;
tree[1].used = 1;
for (int i = 0; i < M; i++) {
int k;
int ID;
cin >> ID >> k;
int parent = ID;
tree[parent].has_child = true;
for (int j = 0; j < k; j++) {
int temp;
cin >> temp;
tree[temp].level = tree[parent].level + 1;
tree[temp].used =true;
tree_level = tree[parent].level + 1;
}
}
// brute force method.
for (int i = 0; i <= tree_level; i++) {
int cnt = 0;
for (auto p = ++tree.begin(); p != tree.end(); p++) {
if (p->level == i && p->used && !p->has_child) cnt++;
}
if (i != tree_level) cout << cnt << " ";
else cout << cnt;
}
getchar();
getchar();
return 0;
}
/*********************************
思路2 儲存所有資訊並通過DFS計數每層葉子節點
**********************************/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Node {
vector<int> childs;
};
int layer_counter[100] = {0};
int maxlayer = 0;
void DFS(int index, int layer, Node* node) {
maxlayer = max(layer, maxlayer); // update maxlayer
if (node[index].childs.size() == 0) {
layer_counter[layer]++;
return ;
}
for (int i = 0; i < node[index].childs.size(); i++) {
DFS(node[index].childs[i], layer + 1, node);
}
}
int main(void)
{
int M, N;
cin >> N;
if (!N) return 0;
Node *node = new Node[N+1];
cin >> M;
// for(int i = 0; i< 100; i++)
// node[i].layer = 0;
while(M--) {
int id, k;
cin >> id >> k;
while (k--) {
int child;
cin >> child;
node[id].childs.push_back(child);
}
}
DFS(1, 0, node);
for (int i = 0; i <= maxlayer; i++) {
if (i != maxlayer)
cout << layer_counter[i] << " ";
else
cout << layer_counter[i];
}
getchar();
getchar();
return 0;
}