每日一題30 拓補排序

2021-07-02 22:23:55 字數 1210 閱讀 7347

所謂拓補排序就是確定圖中節點的一種順序,使得某些在別的節點訪問之前不能訪問到的節點排在後面。所以該演算法的核心是每一步選擇乙個沒有入度的節點,因為沒有入度意味著該節點沒有前驅,得到乙個節點後,就把以新得到的節點為起點的邊去除,從剩下的節點重複前面的過程直到所有節點都排好序或找不到乙個不具有入度的節點為止。但是實際實現中不必真的刪除邊,只需要記錄每個頂點的入度數,刪除邊的操作就可以用遞減相關頂點入度的操作來代替。入度為0的節點就是下乙個要選擇的節點。

#ifndef _topologicalsort_h_

#define _topologicalsort_h_

#include "../include/directedweightgraph.h"

#include "../include/vector.h"

#include

using

namespace mydatastructure;

using

namespace

std;

namespace mytools

}else

}//為了避免每次尋找入度為0的節點,利用乙個棧

//記錄最新的入度為0的節點,用佇列、鍊錶都是可以的

stack

zerodegreev;

for (int i = 0; i < size; ++i)

sortedvertices.clear();

int unsortedverticecount = graph.getverticecount();

//如果棧空,說明沒有入度為0的節點了

//此時要麼所有節點已排序,要麼圖中有環,

//不可以拓補排序

這是輸入的圖,表示課程的先後關係。

執行拓補排序演算法後得到的序列如下:

可以看到這是一種符合要求的排序,但也還有其他的排序方式,因為在某一時刻,圖中具有0入度的頂點可能不止乙個,演算法只取乙個比較容易取到的頂點而已。

每日一題 92 快速排序

題目來自網路 題目 1 基於陣列的快速排序 題目 2 基於鍊錶的快速排序 題目 1 基於陣列的快速排序 思路 使用分治的思想,先選擇樞軸,之後執行一次劃分,並把原序列劃分兩個子串行,之後遞迴處理。int partition int narr,int nstart,int nend narr nsta...

每日一題 快速排序 20091016

b 問題描述 b 請實現快速排序,並討論pivot對複雜度的影響。b 問題分析 b 快速排序是目前使用頻率較高的排序 當然,有時候為了偷懶就可以冒泡一下 很多參考書上對pivot的選擇就是選擇第乙個元素,但如果是乙個高度排序的序列的話,時間複雜度就會接近o n2 還不如直接用冒泡完成。所以選擇乙個合...

每日一題 合併排序

title 每日一題 合併排序 date 2019 11 02 23 53 02 tags 73.合併排序 10分 c時間限制 3000 毫秒 c記憶體限制 3000 kb 題目內容 使用合併排序演算法,對輸入的n個資料進行按公升序排序。輸入描述 分兩行,第一行是整數n,第二行是n個整數,每個整數之...