1. 程式人生 > >洛谷p1955[NOI2015]程式自動分析

洛谷p1955[NOI2015]程式自動分析

題目:

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

考慮一個約束滿足問題的簡化版本:假設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” 表示不可被滿足。

題目分析

很明顯的並查集+離散化……不知道少寫個路徑壓縮會不會T,反正我沒試過
願意試試也行,反正我懶了(……)
讀入之後離線處理,把xi=xj的操作排在前面丟進一個並查集,然後把xi!=xj的當做查詢去查,如果xi和xj的祖先是一樣的就輸出NO就好了 判完了還沒輸出NO就是符合條件的啦

昂,那麼這道題我sb錯的點在——

  • 離散化完了陣列fa要開兩倍 因為第一次寫離散化不清楚這個事情所以找了很久…(最後打開了fsy神犇的部落格對著查錯(咳)
  • 判斷到不符條件的不是輸出完NO直接break跑掉嗎。。我輸了NO就沒幹別的事情(沒有break,check標記倒是打上了),所以當一組資料裡面有多個不符條件的就會輸出一堆NONONONONONONO(……)

然後應該就沒有啦,題很水,不是藍題難度,應該也就綠題(……)