POJ1094 拓撲排序和它的唯一性

2022-05-06 19:45:10 字數 1631 閱讀 5448

比較模板的topological-sort題,關鍵在於每個元素都嚴格存在唯一的大小關係,而一般的拓撲排序只給出乙個可能解,這就需要每趟排序的過程中監視它是不是總堅持一條唯一的路徑。

演算法導論裡面的拓撲排序運用的是dfs the dag,記錄每個頂點的進入時間和離開時間,根據其先後插入單鏈表的做法。而我認為一種方法是更直觀的,就是維護乙個入度為0的頂點集合(我用的佇列其實沒差),每次對其中乙個加入結果序列——同時刪除它的所有出邊——更新其他點的入度的做法,在我的演算法資料結構實現模板裡有正確實現打廣告

在判斷拓撲排序結果唯一性時這種方法也表現出了乙個優勢,每次訪問0入度集合時檢視大小,當元素多於1的時候可行的選擇就出現了分歧——即可判定此dag的拓撲排序不唯一(當然本題的資訊在不斷更新,所以不能立刻判死)。

ac**:

1 #include 2 #include 3 #include 4

using

namespace

std;5//

poj1094

6int

const inf = 0x3f3f3f3f;7

//返回空陣列說明暫時不行8//

cyclic說明矛盾

9 vector ts(vectorint> > const &g, bool &cyclic)

1021}22

}23 queueq;

24for (int i = 0; i < n; ++i) if (d[i] == 0

) q.push(i);

25int

d0;26

int tot = 0;27

bool not_unique = false

;28 vectorans;

29while (!q.empty())

3035 d0 =q.front();

36q.pop();

37ans.push_back(d0);

38 ++tot;

39for (int i = 0; i < n; ++i)

4048}49

}50}51

if (tot != n) cyclic = true;52

if (not_unique) return vector();

53else

return

ans;54}

55int

main()

5682}83

for (int i = 0; i < bignum + 1 - ori_size; ++i)

8487

}88 g[num1][num2] = 1;89

//judge from here

90bool cycle = false;91

if (g.size() 9299

else

100106

}107

}108

else

109116

else

117125

else

126133

}134

}135

}136

}137

}138

return0;

139 }

POJ 1094 拓撲排序

文章大意是將n個字母排序 n 26 最終必須排成鍊錶式的輸出 一旦確定或者出現環,記錄當前步數,後續輸入無視 加個拓撲排序判斷圖的總結 1 如果輸入的有向圖中的點,不存在入度為0的點,則存在迴路,反過來則不成立 2 如果入隊的點的個數小於輸入的點的個數,則肯定存在迴路 3 如果存在的入度為零的點大於...

拓撲排序 poj1094

此題題目有點小問題,那也是很多人ac不了的原因 問題是,當給定的前k項條件能夠確定出大小順序時,即便k項之後出現了矛盾條件,輸出也應該是sorted sequence determined after k relations 後面再輸出排序好的序列!include include using nam...

POJ 1094 拓撲排序)

拓排 各種判 program p1094 type map3 record indegree array a z of longint map array a z 1.26 of char outdegree array a z of longint end var n,m,i,j,num,valu...