1. 程式人生 > >P1955 [NOI2015]程式自動分析 && 離散化學習 && lower_bound學習

P1955 [NOI2015]程式自動分析 && 離散化學習 && lower_bound學習

題目連結

https://www.luogu.org/problemnew/show/P1955

題目描述

在實現程式自動分析的過程中,常常需要判定一些約束條件是否能被同時滿足。

考慮一個約束滿足問題的簡化版本:假設x1,x2,x3...代表程式中出現的變數,給定n個形如xi=xj或xi≠xj的變數相等/不等的約束條件,請判定是否可以分別為每一個變數賦予恰當的值,使得上述所有約束條件同時被滿足。例如,一個問題中的約束條件為:x1=x2,x2=x3,x3=x4,x4≠x1,這些約束條件顯然是不可能同時被滿足的,因此這個問題應判定為不可被滿足。

現在給出一些約束滿足問題,請分別對它們進行判定。

輸入輸出格式

輸入格式:

從檔案prog.in中讀入資料。

輸入檔案的第1行包含1個正整數t,表示需要判定的問題個數。注意這些問題之間是相互獨立的。

對於每個問題,包含若干行:

第1行包含1個正整數n,表示該問題中需要被滿足的約束條件個數。接下來n行,每行包括3個整數i,j,e,描述1個相等/不等的約束條件,相鄰整數之間用單個空格隔開。若e=1,則該約束條件為xi=xj;若�e=0,則該約束條件為xi≠xj;

輸出格式:

輸出到檔案 prog.out 中。

輸出檔案包括t行。

輸出檔案的第 k行輸出一個字串“ YES” 或者“ NO”(不包含引號,字母全部大寫),“ YES” 表示輸入中的第k個問題判定為可以被滿足,“ NO” 表示不可被滿足。

輸入輸出樣例

輸入樣例#1: 
2
2
1 2 1
1 2 0
2
1 2 1
2 1 1
輸出樣例#1: 
NO
YES
輸入樣例#2: 
2
3
1 2 1
2 3 1
3 1 1
4
1 2 1
2 3 1
3 4 1
1 4 0
輸出樣例#2: 
YES
NO

說明

【樣例解釋1】

在第一個問題中,約束條件為:x1=x2,x1≠x2。這兩個約束條件互相矛盾,因此不可被同時滿足。

在第二個問題中,約束條件為:x1=x2,x1=x2。這兩個約束條件是等價的,可以被同時滿足。

【樣例說明2】

在第一個問題中,約束條件有三個:x1=x2,x2=x3,x3=x1。只需賦值使得x1=x1=x1,即可同時滿足所有的約束條件。

在第二個問題中,約束條件有四個:x1=x2,x2=x3,x3=x4,x4≠x1。由前三個約束條件可以推出x1=x2=x3=x4,然而最後一個約束條件卻要求x1≠x4,因此不可被滿足。

【資料範圍】

【時限2s,記憶體512M】

題目分析