2019年湘潭大学程序设计竞赛(重现赛)F.Truthman or Fakeman(并查集)
鏈接:https://ac.nowcoder.com/acm/problem/25579
來源:??途W(wǎng)
時(shí)間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
Special Judge, 64bit IO Format: %lld
題目描述
有n個(gè)人在玩一個(gè)身份扮演的游戲。
把這n個(gè)人編號(hào)為1,2,3…n。
其中每個(gè)人會(huì)扮演下面兩種身份中的一種:
Truthman:當(dāng)某個(gè)人扮演Truthman時(shí),這個(gè)人只會(huì)說真話。
Fakeman:當(dāng)某個(gè)人扮演Fakeman時(shí),這個(gè)人只會(huì)說假話。
這n個(gè)人是互相知道身份的,但是Casya作為一個(gè)旁觀者不知道任何一個(gè)人的身份。
為了讓Casya有可能推斷這些人的身份,這n個(gè)人說了m句話。
每句話的內(nèi)容只包含某人對(duì)某人身份的一條描述,且被Casya記錄為以下形式:
u,v,0 – u認(rèn)為v是一個(gè)Fakeman;
u,v,1 – u認(rèn)為v是一個(gè)Truthman;
當(dāng)然這些話不一定都是真話,這取決于說話的人的身份。
但是可以肯定的是身份只有兩種,也就是說某個(gè)人不是Truthman就是Fakeman。
Casya想知道不違反上面的條件和記錄最少有多少個(gè)Fakeman,除此之外他還想得到一組在此情況下的一組合理的解—即所有人的身份?;蛘叽_定記錄本來就是矛盾的所以沒有任何符合條件的解。
輸入描述:
第一行一個(gè)數(shù)字T(1≤T≤30)–樣例個(gè)數(shù)。
其中每個(gè)樣例:
第一行兩個(gè)數(shù)字n,m(1≤n≤1e5 )。
然后m行,每一行包含三個(gè)整數(shù)u,v,w(1≤u,v≤n,w={0,1})
保證所有樣例中\(zhòng)sum n∑n不超過2×1e6 。
保證所有樣例中\(zhòng)sum m∑m不超過2×1e6。
輸出描述:
每個(gè)樣例輸出一行。
如果存在合理的解,輸出一個(gè)長度為n的字符串,且只包含’0’或’1’。
其中第i個(gè)字符為’0’表示iii是一個(gè)Fakeman,為’1’表示i是一個(gè)Truthman。并使得Fakeman的數(shù)量最少。如果有多個(gè)解符合要求,輸出任意一個(gè)即可。
如果不存在任何合理的解,輸出-1。
示例1
輸入
復(fù)制
輸出
復(fù)制
/*
當(dāng)然這些話不一定都是真話,這取決于說話的人的身份。
當(dāng)u說v是truthman,(u,v,w = 1)時(shí),u,v一定是同一陣營的,要么都truth,要么都fake。
而u說v是fakeman,(u,v, w = 0)時(shí),u,v一定是不同陣營的。
此時(shí)我們需要?jiǎng)澐殖鰞蓚€(gè)集合,一個(gè)truthman,另一個(gè)fakeman,
這兩個(gè)集合中哪個(gè)是truthman集合取決于哪個(gè)集合人數(shù)更多,因?yàn)檫@兩個(gè)集合一定互斥,
題目要求最少的fakeman,反之更多的truthman。
一個(gè)人的身份開始不確定,本題處理方式:原編號(hào)+n作為另一種可能身份的編號(hào)。
本題有可能某些人是沒有被描述到的,由于初始化集合操作,
最初每個(gè)人只屬于一個(gè)小集合,此時(shí)到最后可以統(tǒng)一處理,
哪個(gè)集合人數(shù)多就歸到哪個(gè)集合去。
-1的情況:
查一個(gè)人的根,當(dāng)一個(gè)人的根有兩種身份的時(shí)候,直接輸出-1即可
*/
Ac_code:
總結(jié)
以上是生活随笔為你收集整理的2019年湘潭大学程序设计竞赛(重现赛)F.Truthman or Fakeman(并查集)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 问题 F: 积木大赛(模拟)
- 下一篇: Chino with Geometry(