拓撲排序 入度

2021-09-30 13:37:41 字數 1650 閱讀 9905

換個形象點的解釋,我們在學習一門課程之前,應該需要一定的預備知識,比如在學習b課程之前我們需先學習a(後用< x,y > 表示x課程是y課程的預備知識,其實與上述有序偶的含義相同),則有 < a,b >。我們還有 < c,b >, < b,d >, < e,d >, < d,f >, < d,g >, < h,g >. 現在要求你合理安排a-h這些課程的學習順序。這個任務的要求實際上就是對a-h進行拓撲排序。 

以上面給課程排序為例,我們首先要學的,一定是乙個不需要任何預備知識的課程,然後學完這個課程之後,根據邊的關係再看有哪些新的課程可以學習,同時我們還要清楚,學完一門課程後,就不需要再次學習這一門課程了。

我們將其與圖做個模擬。

不需要預備知識的課程-> 入度為0的點 

新的課程->所指向的下乙個點 

每門課之學一次->從圖中刪除節點 && 從圖中刪除有向邊 

接著再根據圖模擬結果決定儲存的資料

入度為0的點->需要儲存每個節點的入度 

所指向的下乙個點->需要存每個節點的後繼 

刪除節點與有向邊-> 這裡討論一下: 

如果我們真的刪除了節點和有向邊,那就意味著無法在找到這些資料了。因為我們還需要判斷是否形成了dag,最保險的做法是將下乙個節點的入度-1。如果發現某個節點的入度為-1了,表明存在有向環,那麼說明不存在與拓撲排序。

hdu1285

要求輸出時編號小的隊伍在前;輸入資料保證是正確的,即輸入資料確保一定能有乙個符合要求的排名。

#include

#include

#include

#include

#include

using

namespace

std;

const

intmaxn =

505;

intindegree[

maxn];

vector

<

int> mp[

maxn];

queue

<

int> q,ans;

void

init(

intn)

while(!q

.empty

())

while

(!ans

.empty

()) }

bool

solve(

intn)

} if(

q.empty

())

while(!q

.empty

())

else

indegree[mp

[t][

i]] --;//每次去掉所指向的點的一條邊,當乙個點沒有被指向,入度為0時,就可以被學習 }

mp[t].

clear

();

if(!succ) }

if(!succ) }

if(ans

.size

() != n)

return

succ; }

intmain()

if(solve

(n))

printf

("\n");

} }

return0;

}

拓撲排序 入度檢測

拓撲排序 若有 a b,則要求a一定要在b之前列印出來。思路 找到乙個入度為0的節點,列印出來,把與之相鄰的節點入度 1 重複上面工作。void topsort graph g int temp new int g n 幫助判斷每個節點是否已經列印出來 for i 0 in i temp i 0 i...

拓撲排序 九度1448

題目 註解 自己用陣列實現的,沒有用vector,有點笨吧!後附 王道正規解答 include using namespace std int incount 110 記錄入度 struct relation rt 110 int main for int i 0 i m i int num 0 f...

python 拓撲排序 Python 拓撲排序

python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...