換個形象點的解釋,我們在學習一門課程之前,應該需要一定的預備知識,比如在學習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...