演算法期中 拓撲序 Special judge

2021-08-13 03:03:46 字數 1316 閱讀 8553

description

在圖論中,拓撲序(topological sorting)是乙個有向無環圖(dag, directed acyclic graph)的所有頂點的線性序列. 且該序列必須滿足下面兩個條件:

每個頂點出現且只出現一次.

若存在一條從頂點 a 到頂點 b 的路徑,那麼在序列中頂點 a 出現在頂點 b 的前面.

對於乙個含有n個節點的有向無環圖(節點編號0到n-1),輸出它的乙個拓撲序.

圖的節點數和邊數均不多於100000,保證輸入的圖是乙個無環圖.

請為下面的solution類實現解決上述問題的topologicalsort函式,函式引數中n為圖的節點數,edges是邊集,edges[i]表示第i條邊從edges[i].first指向edges[i].second. 函式返回值為有向圖的乙個拓撲序. 有向圖有多個拓撲序時,輸出任意乙個即可.

class solution 

};

例1:

n = 3,edges = ,函式應返回或者.

例2:

n = 4,edges = ,函式應返回.

拓撲排序:將有向圖中的頂點以線性方式進行排序。即對於任何連線自頂點u到頂點v的有向邊uv,在最後的排序結果中,頂點u總是在頂點v的前面。

過程:從 dag 圖中選擇乙個 沒有前驅(即入度為0)的頂點並輸出。

從圖中刪除該頂點和所有以它為起點的有向邊。

重複 1 和 2 直到當前的 dag 圖為空或當前圖中不存在無前驅的頂點為止。後一種情況說明有向圖中必然存在環。

class solution 

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

int temp = zero.front();

zero.pop();

result.push_back(temp);

// 進行刪去點temp的操作,使得相應的點的入度減1

for (unordered_set

::iterator it = graph[temp].begin(); it != graph[temp].end(); it++) }}

return result;

}vector

> makegraph(int n, vector

int, int>>& edges)

return result;

}vector

computeindegree(vector

> graph)

}return result;

}};

演算法期中 拓補序

在圖論中,拓撲序 topological sorting 是乙個有向無環圖 dag,directed acyclic graph 的所有頂點的線性序列.且該序列必須滿足下面兩個條件 每個頂點出現且只出現一次.若存在一條從頂點 a 到頂點 b 的路徑,那麼在序列中頂點 a 出現在頂點 b 的前面.對於...

拓撲排序 字典序

1.用優先佇列維護 2.從後往前排序,每次判斷節點的出度,出度 0 進入優先佇列.3.用vector陣列做鄰接表表示整個圖 include include include include include using namespace std const int maxn 30005 vector ...

演算法期中 分組

對於乙個整數數列a 0 a 1 a n 1 進行分組,要求每組1到2個數,並且同組之和不能大於w.求最少可以分成多少組.1 n 100000,1 a i w 1000000000.例1 當a w 5,minpartition a,w 返回3.將2和3放一組,4和5各自單獨作為一組,共3組.例2 當a...