HDU 5963 朋友 樹上博弈

2021-08-25 17:30:13 字數 894 閱讀 7885

給定一棵樹,樹中每一條邊有乙個權值為0或者1,每次遊戲需要找到乙個點,滿足該點到其父親的邊權為1,然後找到這個點到根節點的簡單路徑,將路徑上所有邊的權值翻轉。

當一方無法操作時,另一方就獲勝。

每次遊戲有m個操作,0 x表示指定x為根節點,要求輸出誰會贏;1 x y z表示將x和y之間的邊修改為z。

本題乍一看還是有些難度的。但是仔細思考的話,可以找到乙個化繁為簡的方法。

可以看出一條邊權如果為0,那麼至少要翻轉偶數次才能變為0;如果是1,那麼至少要翻轉奇數次才能變為0,因此我們可以只考慮根節點的邊,不考慮圖中其它的邊。

對根節點直接匯出的邊權進行累加,如果和為偶數,那麼後手勝,如果為奇數,那麼先手勝。

本題存圖方式很多,可以用 map,這種結構體的形式來存,也可以對兩個點進行一下下類似雜湊的操作。

如 mapmp; mp[a*10000+b]表示之間的邊權,這些都是可以採用的方式。

#include #include #include #include #include #define rep(i,a,b) for(int i = a;i <= b;i++)

using namespace std;

const int n = 4*1e4+100;

struct pointtmp;

mapmp;

int n,m;

int deg[n];

bool operator < (point a,point b)

int main()

} rep(i,1,m)

else

else if(mp[tmp] == 1 && z1 == 0)

}} }

return 0;

}

HDU 5963 朋友 (樹上博弈,思維)

題面 思路 我們通過推理應該知道如下性質 那麼我們只需要維護出每乙個節點邊權為1的出邊個數即可,偶數個boys 贏,奇數個girls贏。關於第二個性質的證明 include using namespace std typedef pairpii const int maxn 40000 10 def...

HDU5963 朋友 博弈

problem description b君在圍觀一群男生和一群女生玩遊戲,具體來說遊戲是這樣的 給出一棵n個節點的樹,這棵樹的每條邊有乙個權值,這個權值只可能是0或1。在一局遊戲開始時,會確定乙個節點作為根。接下來從女生開始,雙方輪流進行 操作。當一方操作時,他們需要先選擇乙個不為根的點,滿足該點...

HDU 5963 朋友 思維 博弈

題意 中文題。思路 考慮和根相連的一條樹鏈,如果這條樹鏈上和根相連的那條邊權值為1,那麼最終在該鏈上的操作次數要為奇數次才能使得和根相連的邊的權值變為0 因為不論選擇該條樹鏈上哪個點,此邊的權值總會翻轉 同理可得和根相連的邊若初始權值為0要操作偶數次。而無論兩個人怎麼操作,都不會改變這些根的直連邊變...