給定有向圖關係 (=, <, >),判斷是否存在衝突、不確定或確定唯一拓撲序。多測試用例。
// 并查集
int find(int x) { return fa[x]==x ? x : fa[x]=find(fa[x]); }
// Tarjan
void tarjan(int u) {
dfn[u]=low[u]=++timer;
st.push(u); inStack[u]=1;
for (int v : adj[u]) {
if (!dfn[v]) { tarjan(v); low[u]=min(low[u], low[v]); }
else if (inStack[v]) low[u]=min(low[u], dfn[v]);
}
if (dfn[u]==low[u]) { /* pop SCC */ }
}
// 拓撲排序判斷唯一性
bool topoUnique() {
queue q;
for (int i=1; i<=sccCnt; ++i) if (ind[i]==0) q.push(i);
while (!q.empty()) {
if (q.size() > 1) return false; // 不唯一
int u=q.front(); q.pop();
for (int v: dag[u]) if (--ind[v]==0) q.push(v);
}
return true;
}
O(n+m) 每測試用例,n≤30000, m≤100000,完全足夠。