237 程式自動分析 離散化 並查集

2021-10-05 13:28:41 字數 1060 閱讀 8081

鏈結

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

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

例如,乙個問題中的約束條件為:x1=x2,x2=x3,x3=x4,x1≠x4,這些約束條件顯然是不可能同時被滿足的,因此這個問題應判定為不可被滿足。

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

1≤n≤1000000

1≤i,j≤1000000000

很明顯可以用並查集做,集合元素間的關係具有傳遞性,相互性,借助hash先無序離散化,再初始化並查集。

#include

#include

using

namespace std;

const

int n =

2e6+7;

struct nodeqy[n]

;int n;

int p[n]

;unordered_map<

int,

int> h;

//不支援c++11就上map

intget

(int x)

intfind

(int x)

intmain()

;}for(

int i=

1;i<=n;i++

) p[i]

= i;

for(

int i=

1;i<=k;i++)}

int flag=1;

for(

int i=

1;i<=k;i++)}

}if(flag)

puts

("yes");

else

puts

("no");

}return0;

}

牛客網 程式自動分析 並查集 離散化

第一眼看這道題秒速寫並查集然後wa了,仔細看資料嚇了一跳,1e9的數太大,而且數字之間不需要確切的比較,只需要清楚他們的大小關係。所以,對他們進行離散化就ok 下面是ac includeusing namespace std const int maxn 1e6 5 int p maxn book ...

並查集 程式自動分析

原題鏈結 規模太大,先用離散化縮小。考慮所有相等條件,把所有相等的變數 進同乙個集合中。考慮所有不等條件,若兩個變數處於同一集合中,則證明無法同時滿足這兩個條件。實現 include define n 100000 10 using namespace std int n,m int a 2 n f...

並查集 程式自動分析

給你兩個邏輯關係,判斷是否有衝突 先將兩個邏輯分開來看,前乙個邏輯存在那麼後乙個邏輯一定不存在,如果存在那麼答案就錯誤了,可以用並查集維護,詳細見 define fre yes include include include const int n 1000005 struct message ar...