某文件系統中有N個目錄,每個目錄都一個獨一無二的ID。每個目錄只有一個父目錄,但每個父目錄下可以有零個或者多個子目錄,目錄結構呈樹狀結構。
假設,根目錄的ID為0,且根目錄沒有父目錄,其他所有目錄的ID用唯一的正整數表示,並統一編號。
現給定目錄ID和其父目錄ID的對應父子關系表[子目錄ID,父目錄ID],以及一個待刪除的目錄ID,請計算並返回一個ID序列,表示因為刪除指定目錄后剩下的所有目錄,返回的ID序列以遞增序輸出。
注意:
1、被刪除的目錄或文件編號一定在輸入的ID序列中;
2、當一個目錄刪除時,它所有的子目錄都會被刪除。
輸入描述: 輸入的第一行為父子關系表的長度m;接下來的m行為m個父子關系對;最后一行為待刪除的ID。序列中的元素以空格分割,參見樣例。
輸出描述: 輸出一個序列,表示因為刪除指定目錄后,剩余的目錄ID。
示例1
輸入
5
8 6
10 8
6 0
20 8
2 6
8
輸出
2 6
#方法一
#include <stdio.h> #include <malloc.h> int root[100] = {0}; int node[100] = {0}; int rm_list[100] = {0}; int rm_cnt = 0; void find_rm_node(int table_len, int rm_node) { for(int i=0;i<table_len;i++) { if(root[i] == rm_node) { int add = 0; for(int j=0;j<rm_cnt;j++) { if(rm_node == rm_list[j]) { add = 1; break; } } // root[i] = -1; // node[i] = -1; if(add == 0) rm_list[rm_cnt++] = root[i]; rm_list[rm_cnt++] = node[i]; find_rm_node(table_len, rm_list[rm_cnt-1]); } } } int cmp(void *a, void *b) { return *(int*)a > *(int*)b ? (*(int*)a - *(int*)b) : (*(int*)b - *(int*)a); } int main() { int table_len = 0; int result[100] = {0}; scanf("%d",&table_len); // int result[100] = {0}; for(int i=0;i<table_len;i++) { scanf("%d%d",&node[i],&root[i]); } int rm_node = 0; scanf("%d",&rm_node); find_rm_node(table_len,rm_node); int j=0; for(int i=0;i<table_len;i++) { for(int j=0;j<rm_cnt;j++) { if(rm_list[j] == root[i]) { root[i] = -1; } if(rm_list[j] == node[i]) { node[i] = -1; } } } for(int i=0;i<table_len;i++) { if(root[i] != 0 && root[i]!=-1) result[j++] = root[i]; if(node[i] != 0 && node[i]!=-1) result[j++] = node[i]; } // int j1 = j; for(int i=0; i<j;i++) { for(int j1=i+1; j1<j;j1++) { if(result[i]==result[j1]) { result[i] = -1; // j1 --; break; } } } qsort(result,j ,sizeof(int),cmp); for(int i=0;i<j;i++) { if(result[i]!=0 && result[i] != -1) printf("%d ",result[i]); } printf("\n"); }
#方法二
def get_input(): cnt, nodes = int(input()), {} for i in range(cnt): c, p = [int(i) for i in input().split()] if nodes.get(p): nodes[p].append(c) else: nodes[p] = [c] return cnt, nodes, int(input()) def get_result(nodes, remove_list): result = [] for key, val in nodes.items(): if key not in remove_list and key != 0: result.append(key) for k in val: if k not in remove_list and k != 0: result.append(k) return result def generate(): cnt, nodes, target = get_input() remove_items = [] def remove_node(node): remove_items.append(node) if nodes.get(node): for j in nodes.get(node): remove_node(j) remove_node(target) result = get_result(nodes, remove_items) result = sorted(list(set(result))) return ' '.join([str(i) for i in result]) if __name__ == '__main__': print(generate())
#方法三
n = int(input()) import sys root = [] node = [] for i in range(n): line = sys.stdin.readline().strip().split() node.append(line[0]) ##定義子目錄 root.append(line[1]) ##定義父目錄 rm_node=input() index=[] for i in range(len(node)): index.append(i) dict_root = dict(zip(index, root))##定義索引和子目錄的字典 dict_node = dict(zip(index, node))##定義索引和父目錄的字典 pop_index = list(i for i in range(len(node)) if dict_root.get(i)==rm_node) if rm_node in node and rm_node not in root: res = list(set(node+root)) res.remove(rm_node) res.remove('0') print(' '.join(str(x) for x in res)) if rm_node in root: for i in pop_index: del dict_node[i] new_node=list(set(list(dict_node.values()))) new_root=list(set(root)) new_root.remove(rm_node) if rm_node not in node: res=list(set((new_node + new_root))) res.remove('0') print(' '.join(str(x) for x in res)) if rm_node in node: new_node.remove(rm_node) res = list(set((new_node + new_root))) res.remove('0') print(' '.join(str(x) for x in res))