朋友(翻轉樹邊權值比賽)——依然是思維

来源:https://www.cnblogs.com/Lour688/archive/2020/04/12/12688771.html
-Advertisement-
Play Games

思維 我們只需看與根節點直接相連的邊權權值是1的有幾條,就可判斷以該節點為根節點而開始游戲的勝者,奇數->先手勝 偶數->後手勝。 ...


B君在圍觀一群男生和一群女生玩游戲,具體來說游戲是這樣的:
給出一棵n個節點的樹,這棵樹的每條邊有一個權值,這個權值只可能是0或1。 在一局游戲開始時,會確定一個節點作為根。接下來從女生開始,雙方輪流進行 操作。
當一方操作時,他們需要先選擇一個不為根的點,滿足該點到其父親的邊權為1; 然後找出這個點到根節點的簡單路徑,將路徑上所有邊的權值翻轉(即0變成1,1 變成0 )。
當一方無法操作時(即所有邊的邊權均為0),另一方就獲得了勝利。
如果在雙方均採用最優策略的情況下,女生會獲勝,則輸出“Girls win!”,否則輸 出“Boys win!”。
為了讓游戲更有趣味性,在每局之間可能會有修改邊權的操作,而且每局游戲指 定的根節點也可能是不同的。
具體來說,修改邊權和進行游戲的操作一共有m個,具體如下:
“0 x”表示詢問對於當前的樹,如果以x為根節點開始游戲,哪方會獲得勝利。

“1 x y z ”表示將x和y之間的邊的邊權修改為z。
B君當然知道怎麼做啦!但是他想考考你。
Input包含至多5組測試數據。
第一行有一個正整數,表示數據的組數。
接下來每組數據第一行,有二個空格隔開的正整數n,m,分別表示點的個數,操 作個數。保證n,m< 40000。
接下來n-1行,每行三個整數x,y,z,表示樹的一條邊。保證1<x<n, 1<y< n, 0 <= z <= 1。
接下來m行,每行一個操作,含義如前所述。保證一定只會出現前文中提到的兩 種格式。
對於操作0,保證1 <= x <= n ;對於操作1,保證1 <= x <= n, 1 <= y <= n, 0 <= z <= 1,保證樹上存在一條邊連接x和y。
Output對於每組數據的每一個詢問操作,輸出一行“Boys win!”或者“Girls win!”。Sample Input
2
2 3
1 2 0
0 1
1 2 1 1
0 2
4 11
1 2 1
2 3 1
3 4 0
0 1
0 2
0 3
0 4
1 2 1 0
0 1
0 2
0 3
1 3 4 1
0 3
0 4
Sample Output
Boys win!
Girls win!
Girls win!
Boys win!
Girls win!
Boys win!
Boys win!
Girls win!
Girls win!
Boys win!
Girls win! 
思路:
對於這種類似的題,我們知道一定有隱藏的規律。
主要就是看直接連到根節點的樹邊。
①假如連接到根節點的邊只有一條,我們把這條邊叫作X。
  1.那麼我們想,如果X邊權是1:
    先手可以不管X後面的邊,只將X翻成0,即使下一步,另一人將後面的可以翻邊翻了,那麼X又變成1了,這樣不管另一人翻後面的哪條邊,先手都可以只翻X,消耗另一人,直至X後面全是0,再翻X,先手勝利。這種方法就是題目中所說的”最優策略“。
  2.相反的,X邊權是0:
   先手只能翻X後面的邊,而另一人(後手)就可以仿照上一種情況的先手,後手取勝。
②類似的,我們將直接連接到根節點的,且邊權是1的邊拓展到多條,將它們統稱為X:
  1.如果X的數量是奇數,先手與後手(一條鏈一條鏈地)輪流消耗對方,最終剩下一條權值是1的X,還是先手先翻X,先手取勝(仿照①1.)
  2.同理,X的數量是偶數,先手與後手(一條鏈一條鏈地)輪流消耗對方,最終剩下一條權值是1的X,是後手先翻X,後手取勝(仿照①2.)
  註意:(在②中,我們不跟①一樣討論直接連到根節點的,邊權是0的邊,因為如果這條邊後面的邊有權值1,先手翻了之後,這條直接連到根節點的邊就成1了,後手就可以用其消耗對方,後手勝利,也就相當於X是0條的時候,即X數量是偶數,同②2.結論)
總結:
  我們只需看與根節點直接相連的邊權權值是1的有幾條,就可判斷以該節點為根節點而開始游戲的勝者,奇數->先手勝 偶數->後手勝
代碼:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxn=4e4+3;
 7 int head[maxn],n,m,cnt,key;
 8 int x,y,z;
 9 struct Edge{bool wei;int to,next;}e[2*maxn];
10 void Add(int x,int y,int z){
11     e[++cnt].to=y;
12     if(z)e[cnt].wei=1;else e[cnt].wei=0;
13     e[cnt].next=head[x];
14     head[x]=cnt;
15 }
16 void Xiugai(int x,int y,int z){
17     for(int i=head[x];i;i=e[i].next){
18         if(y==e[i].to){
19             if(z)e[i].wei=1;else e[i].wei=0;
20             break;
21         }
22     }
23     for(int i=head[y];i;i=e[i].next){
24         if(x==e[i].to){
25             if(z)e[i].wei=1;else e[i].wei=0;
26             return;
27         }
28     }
29 }
30 void Sta(int root){
31     int ans=0;
32     for(int i=head[root];i;i=e[i].next){
33         if(e[i].wei)ans++;
34     }
35     if(ans%2==1)printf("Girls win!\n");
36     else printf("Boys win!\n");
37 }
38 int main(){
39 //    freopen("1.in","r",stdin);
40     int t;    
41     scanf("%d",&t);
42     while(t--){
43         cnt=0;memset(head,0,sizeof(head));
44         scanf("%d%d",&n,&m);
45         for(int i=1;i<n;++i){
46             scanf("%d%d%d",&x,&y,&z);
47             Add(x,y,z);Add(y,x,z);
48         }
49         for(int i=1;i<=m;++i){
50             scanf("%d",&key);
51             if(!key){
52                 scanf("%d",&x);
53                 Sta(x);
54             }else{
55                 scanf("%d%d%d",&x,&y,&z);
56                 Xiugai(x,y,z);
57             }
58         }
59     }
60     return 0;
61 } 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前臺:支持(5+3[時尚單頁風格])八套模版,可以在後臺切換 業務模塊(首頁管理) 1. 網站信息:維護網站基本信息,比如標題、描述、關鍵詞、聯繫方式、地址等 2. 業務說明:網站首頁文字業務介紹 3. 公司理念:網站首頁展示公司的4個理念 4. 輪播圖片:網站首頁上面4個輪播圖5. 項目案例:網站 ...
  • 在前面的博客中已經介紹過如何使用Python來操作MySQL資料庫,最近需要將一批數據從csv文件中遷移到Oracle資料庫中,也打算用Python來實現,趁著這個機會,也寫一篇博客學習總結一些如何使用Python來操作Oracle資料庫。 ...
  • 原文鏈接:http://www.yiidian.com/fastjson/fastjson json javabean.html 1 簡單JSON與JavaBean的轉換 1.1 設計Student實體類 1.2 簡單JSON轉為JavaBean MainApp: 運行效果為: 1.3 JavaBe ...
  • 虛擬機 虛擬機簡介 Java 虛擬機(JVM)是運行java程式的抽象電腦,它是電腦設備的規範,可以採用不同方式進行實現,java 程式通過運行在JVM中實現跨平臺,一次編譯到處運行,不同的操作系統有不同的JDK版本,通過調用JNI方法去實現調用不同操作系統的方法 Java虛擬機不和包括java ...
  • Java 中所謂的引用,看似是指針的問題,實則體現的是JVM對記憶體的管理思想。 -- 魯迅 ...
  • 介面不能創建對象,但是可以被實現(`implements` ,類似於被繼承)。一個實現介面的類(可以看做是介面的子類),需要實現介面中所有的抽象方法,創建該類對象,就可以調用方法了,否則它必須是一個抽象類。 介面:是功能的集合(介面中定義的都是方法) 定義介面使用的也是.java文件;編譯生成的也是 ...
  • 1. Struts2配置項細節 1.1.導入外部xml文件 在struts.xml文件中使用<include>標簽,file屬性上引入外部的.xml文件。 example.xml配置中又分隔了另外一個action,package一般不同。具體如下: 這樣做的目的是為了拆分struts.xml中過多的 ...
  • 基本語法(一) 程式的基本結構 Java程式的基本形式 Java語言是面向對象的語言。Java程式主要以類的形式存在,也叫Class,類也是Java程式的最小程式單位。 Java程式要求所有執行語句、方法都必須放在類里。 最簡單的Java程式: 在上面的 Hello 類中,只是一個空類的定義,沒有任 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...