給定 n 個積木塊,m 條關係(<, >, =),判斷關係是否自洽:
// 並查集
int find(int x) { return fa[x]==x ? x : fa[x]=find(fa[x]); }
void unite(int a, int b) { a=find(a); b=find(b); if(a!=b) fa[a]=b; }
// 處理 "=" 合併
for each relation: if(op=="=") unite(x,y);
// 建圖
for each relation:
int u=find(x), v=find(y);
if(op==">") addEdge(u,v), indeg[v]++;
if(op=="<") addEdge(v,u), indeg[u]++;
// 拓撲
queue q;
for i in 0..n-1 if(i==find(i) && indeg[i]==0) q.push(i);
bool uncertain = false;
int processed = 0;
while(!q.empty()) {
if(q.size() > 1) uncertain = true;
int u = q.front(); q.pop();
processed++;
for v in adj[u] if(--indeg[v]==0) q.push(v);
}
if(processed < total_sets) CONFLICT;
else if(uncertain) UNCERTAIN;
else OK;