出处http://lishun618-163-com.iteye.com/blog/1489567
#include<iostream> using namespace std; typedef struct Node1{ int index; Node1* next; }Child; typedef struct Node{ int parent; int child_num; int live_child; Node1* child; }Element; int stone_num = 0; int free_stone = 0; int BFSGetNodeWithMaxChild(int root,Element T[],int n); void placeStone(int index,Element T[],int n); int main() { int tree_num; cin >> tree_num; for(int i = 0; i < tree_num; i++) { stone_num = 0; free_stone = 0; int tree_nodes; cin >> tree_nodes; Element * T = new Element[tree_nodes+1]; for(int j = 0; j <= tree_nodes; j++) { T[j].parent = 0; T[j].child_num = 0; T[j].child = NULL; } for(int j = 0; j < tree_nodes; j++) { int node_k, child_num; cin >> node_k >> child_num; T[node_k].child_num = child_num; T[node_k].live_child = child_num; for(int k = 0; k < child_num; k++) { Child * new_child = new Child; cin >> new_child->index; T[new_child->index].parent = node_k; new_child->next = T[node_k].child; T[node_k].child = new_child; } } Child * guard = new Child; guard->index = 1; guard->next = NULL; T[0].child = guard; T[0].live_child = 1; T[0].child_num = 1; int key = BFSGetNodeWithMaxChild( 1, T,tree_nodes); placeStone(key,T,tree_nodes); cout << stone_num << endl; for(int k = 0; k <= tree_nodes; k++) { if(T[k].child == NULL) continue; Child* p = T[k].child; Child * next; do{ next = p->next; delete p; p = next; }while(next != NULL); } delete[]T; } } int BFSGetNodeWithMaxChild(int root,Element T[],int n) { int queue[n]; int head = 0,tail = 0; int key = root; queue[tail++] = root; int temp; while(tail != head) { temp = queue[head]; head = (head + 1) % n; if(T[key].live_child <= T[temp].live_child) key = temp; Child * p = T[temp].child; while(p != NULL) { queue[tail] = p->index; tail = (tail + 1) % n; p = p->next; } } return key; } void placeStone(int index,Element T[],int n) { if(index == 0) return; int parent = T[index].parent; Child * p = T[parent].child; if(p->index == index) { T[parent].child = p->next; delete p; }else{ while(p->next != NULL) { if(p->next->index == index){ p->next = p->next->next; break; } p = p->next; } } T[parent].live_child--; if(free_stone < T[index].live_child) { int more = T[index].live_child - free_stone; stone_num += more; free_stone += more - 1; } if(T[parent].live_child == 0) { free_stone += T[parent].child_num - 1; placeStone(parent, T,n); }else{ int new_root = BFSGetNodeWithMaxChild(parent,T, n); placeStone(new_root,T,n); } }