題目
已知擁有N個頂點的樹。該樹的第i條邊上的兩個節點是ui和vi,長度爲wi。你須要在知足如下的條件下,將樹上的全部節點塗上黑色和白色。(能夠將全部的頂點都塗上一樣的顏色)。html
要求
全部塗有相同顏色的節點,它們之間的距離必須是偶數node
條件python
輸入
要求如下面的方式輸入算法
N u1 v1 w1 u2 v2 w2 . . . uN-1 vN-1 wN-1
輸出
把知足題目條件的N個點的塗鴉狀況一行一行地輸出。
對於i行的話,頂點i是白色的話輸出0,頂點i是黑色的話,輸出1
若是知足條件的狀況有多個的話,輸出任意一種均可以app
例1
輸入測試
3 1 2 2 2 3 1
輸出ui
0 0 1
例2
輸入spa
5 2 5 2 2 3 10 1 3 8 3 4 2
輸出3d
1 0 1 0 1
解題思路code
讀懂題目
首先對於例2來講,樹是長這樣的
能夠看到有5個頂點,4條線。條件中也能夠看出有N個頂點,N-1條線。也就是說,不可能造成一個封閉的環路!
點個點之間距離的計算方法
對於點5和點4的距離。咱們能夠看到距離是2+10+2=14
這是咱們直觀的解法
可是天然界中還存在另一個解法
點5和點4的距離P,能夠看做
A:點1到點5的距離
B:點1到點4的距離
C:點1到點3的距離
P = A+B-2*C
這裏
A = 8+10+2
B = 8+2
C = 8
P = 20 + 10 - 2*8 = 14
這裏的C是4,5的父節點。
咱們能夠取任意一個點爲頂點
這裏咱們取點1爲頂點
若是咱們取3爲頂點的話,會獲得一樣的結果
點和點之間的距離公式化
咱們選擇頂點爲P
計算點A和點B的距離
咱們能夠由上圖看到,
A到B的距離=PA+PB -2*PC
其中2*PC一定是偶數,這在求奇偶性的時候能夠忽略
A,B兩個點之間的距離若是要求是偶數,那麼要麼PA,PB爲偶,要麼PA,PB爲奇。
咱們能夠規定
PA,PB都爲偶數的時候,A,B爲白色
PA,PB都爲奇數的時候,A,B爲黑色
或者
PA,PB都爲偶數的時候,A,B爲黑色
PA,PB都爲奇數的時候,A,B爲白色
這樣就能知足同色節點之間的距離是偶數這樣的要求了
求每一個節點到頂點的距離
咱們規定第一個點位頂點,求每一個點離第一個點距離
這裏要用到dfs算法
關於dfs算法,這篇文章有詳細的描述。這裏就再也不過多敘述了
簡單來講就是要遞歸
代碼
import sys sys.setrecursionlimit(20000000) def prepare(n,arr): nodeArr = [[] for i in range(n)] for ar in arr: nodeArr[ar[0]-1].append([ar[1]-1,ar[2]]) nodeArr[ar[1]-1].append([ar[0]-1,ar[2]]) return nodeArr def dfs(currentNode,distance): res[currentNode] = distance for next in nodeArr[currentNode]: nextNode = next[0] nextNodeDistance = next[1] if res[nextNode] == -1: dfs(nextNode,distance + nextNodeDistance) n = int(input()) arr = [] for i in range(n-1): arr.append([int(s) for s in input().split(" ")]) nodeArr = prepare(n, arr) if n == 1: print(1) else: res = [-1 for i in range(n)] dfs(0,0) result = [(re % 2) for re in res] for re in res: print(re % 2)
題外話
sys.setrecursionlimit(20000000)
這個不加的話,Atcoder提交測試的時候runtime error的報錯