知識點:拓撲排序
輸入:幾個偏序
n=5 # 節點個數
m=4 # 偏序個數
1223
1315
輸出:一種排序方式或不能排序
1 4 2 5 3
思路:儲存輸入的拓撲關係,定義陣列記錄每乙個點狀態。對狀態顯示還未被遍歷的點進行dfs(),遍歷該點以及與該點有直接拓撲關係的點。在dfs過程中將元素壓入存放拓撲結果的vector結構ans。
以下**只是為了記錄思路,**c/python混用,不可執行
vectora[100];
int mark[100]; //為0表示還未遍歷(初始)
vectortopo;
bool dfs(int u) # ***** 例如當前遍歷到節點1(a[1]=[2,3,5])
c[u]=1;topo[--t]=u; # 當前節點已遍歷
return true;
}bool toposort() # 進行topo排序
int main()
if(toposort()) # 進行topo排序,排好了之後輸出
}return 0;
}---------------------
原文:
def dfs(u, price):上文生成的拓撲排序是僅僅滿足了偏序的,程式設計題目中有時可能會有更多的要求,比如每個節點是乙個任務,每個任務有自己的權重,然後要求權重高的盡量往前排等等mark[u] = -1
for v, p in g[u]:
print(u, v)
if mark[v] == -1:
return false
if mark[v] == 0 and not dfs(v, p):
return false
break
mark[u] = 1
return true
# 構建有向圖
g = [ for _ in range(n)]
for m in m:
result =
# 每天
mark = [0] * (n)
topu =
pp =
# minresult = float('inf')
start, end1, end2, price = q[day]
for end in range(end1, end2 + 1):
print(g)
# 預設可以拓撲排序
flag = true
# for i in range(n): # 對所有的節點依次遍歷
for i in range(1): # 對所有的節點依次遍歷
if mark[i] == 1:
continue; # 已經遍歷過,直接跳
if dfs(i, 0) == false: # 有乙個false即不存在 *****
flag = false;
if flag == true:
else:
print result
待更新 ****(歡迎補充)
210:拓撲排序:
官方解法solution/ke-cheng-biao-ii-by-leetcode/
207:是210的簡化版,兩道題都可以使用計算入度的方法。
拓撲排序基礎題 排序
題目 由於公司在2013年的銷售業務成績優秀,公司總經理心情大好,決定給每位員工發獎金。公司決定以每個人本年在公司的貢獻為標準來計算他們得到獎金的多少。於是總經理下令召開 m 方會談。每位參加會談的代表提出了自己的意見 我認為員工 a 的獎金應該比 b 高!總經理決定要找出一種獎金方案,滿足各位代表...
拓撲排序題集
hdu 5438 題意 有n個池塘和m個管道 每個池塘的價值是v,現在由於資金問題要刪除池塘 但是刪除的池塘必須是最多隻連線乙個管道,否則會 管子會因為池塘的刪除而消失 求最後相連的池塘有奇數個的價值總和是多少 解析 建立無向圖 先用拓撲排序刪除入度為1的所以池塘並標記,然後再用深搜判斷是否是奇數連...
1174 拓撲排序 一 模板題
題目鏈結 描述由於今天上課的老師講的特別無聊,小hi和小ho偷偷地聊了起來。小ho 小hi,你這學期有選什麼課麼?小hi 挺多的,比如 1,2還有 3。本來想選yyy2的,但是好像沒有先選過yyy1,不能選yyy2。小ho 先修課 是個麻煩的東西呢。小hi 沒錯呢。好多課程都有先修課程,每次選課之前...