运行要求运行时间限制:2sec内存限制:1024MB有一棵多叉树,上面有N个顶点,这N个顶点的标签是1到N。这个的顶点编号树为1,第i个分支(1<=i<=N-1)由顶点ai和顶点bi相连。为每个顶点设置一个计数器,每个顶点的计数器默认为0。从现在开始,执行少于Q次的操作。在第j次操作(1<=j<=Q)中,将xi添加到顶点pj和从属于顶点pj的节点的计数器值。所有操作完成后,每个顶点的计数器值需要2<=N<=2000001<=Q<=2000001<=ai<=bi<=N1<=pj<=N1<=xj<=10000个所有输入以整数给出的图是树结构。输入是从命令行输入的,符合以下条件:NQa1b1..aN-1bN-1p1x1..pQxQ输出是按照顶点1,2,...N的顺序,输出计数器值所有顶点的例子1Input43122324210110031Output100110111110根据以上输入值,可以构建如下树结构在每次操作中,对应顶点的counter值会有如下过程变化。操作1:以顶点2为根的树,即顶点2、3、4的计数器值分别增加10。此时顶点1、2、3、4的值分别为0、10、10、10。操作2:根为顶点1的树,即顶点1、2、3、4的计数器值分别加100。此时顶点1、2、3、4的值分别为100、110、110、110。操作3:以顶点3为根的树,即顶点3的计数器加1。此时顶点1、2、3、4的值分别为100、110、111,和110分别是叉树上的N个顶点。i为支路数,满足1<=i<=N-1。综上所述,条件是有N个顶点和N-1个分支。2、以例2为例,节点是有值的。3.每个Parent节点的值都会累加到它的子节点的值中。4.每个节点的值已经提前准备好了5.节点上可以有多个值6.方法一:从最高层的根节点开始做dfs遍历,Parent节点必须传递自己的值到以下节点。当一个节点遍历自己时,应该将自己的值加到Parent节点传来的值上。方法二:从最高层的根节点开始进行BFS遍历,Parent节点要将自己的值传给后面的节点。一个节点遍历自己的时候,要把自己的值加到Parent节点发送的值上7.输出值是每个节点的信息,把这些节点的信息做成一个列表,根据节点编号这里根据bfs遍历写AC代码fromsysimportsetrecursionlimitsetrecursionlimit(100000)fromcollectionsimportdequeS=input().split("")N=int(S[0])Q=int(S[1])arr=[]prr=[]foriinrange(N-1):S=input().split("")ar=[int(S[0]),int(S[1])]arr.append(ar)foriinrange(Q):S=input().split("")pr=[int(S[0]),int(S[1])]prr.append(pr)defprepare(n,q,arr,prr):links=[[]for_inrange(n)]values=[0for_inrange(n)]finalValues=[0for_inrange(n)]forarinarr:start=ar[0]-1end=ar[1]-1links[start].append(end)links[end].append(start)forprinprr:i=pr[0]-1x=pr[1]values[i]+=xreturnlinks,values,finalValueslinks,values,finalValues=prepare(N,Q,arr,prr)defbfs():q=deque()q.append((0,-1,0))whilelen(q)>0:currentNode,parentNode,parentAccumulate=q.popleft()parentAccumulate+=values[currentNode]finalValues[currentNode]+=parentAccumulate#输出的值是每个节点的信息,把这些节点的信息做成一个列表,按照一次写入节点号EnterchildNodes=links[currentNode]forchinchildNodes:ifch==parentNode:continueq.append((ch,currentNode,finalValues[currentNode]))bfs()print(*finalValues)A??Ccodebased在dfs遍历上,直接REdropped为了方便大家交流,贴上代码fromsysimportsetrecursionlimitsetrecursionlimit(100000)S=input().split("")N=int(S[0])Q=int(S[1])arr=[]prr=[]foriinrange(N-1):S=input().split("")ar=[int(S[0]),int(S[1])]arr.append(ar)fori在范围(Q):S=input().split("")pr=[int(S[0]),int(S[1])]prr.append(pr)defprepare(n,q,arr,prr):links=[[]for_inrange(n)]values=[0for_inrange(n)]lineStates=[-1for_inrange(n)]finalValues=[0for_inrange(n)](n)]forarinarr:start=ar[0]-1end=ar[1]-1links[start].append(end)links[end].append(start)forprinprr:i=pr[0]-1x=pr[1]values[i]+=x返回链接、值、lineStates、finalValueslinks、values、lineStates、finalValues=prepare(N,Q,arr,prr)defdfs(currentNode,arr,parrentAccumulate):childNodes=links[currentNode]parrentAccumulate+=values[currentNode]finalValues[currentNode]=parrentAccumulatelineStates[currentNode]=1forchinchildNodes:iflineStates[ch]==-1:dfs(ch,arr,parrentAccumulate)dfs(0,links,0)print(*finalValues)
