資料結構04 士兵排隊 拓撲排序的應用

2021-09-13 12:15:18 字數 1427 閱讀 4391

一、題目描述

士兵排隊問題   

時間限制:1.0s     記憶體限制:256.0mb

試題   有n個士兵(1≤n≤26),編號依次為  a,b,c,…,佇列訓練時,

指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,

只能獲得「p1比p2高」這樣的比較  結果(p1、p2∈a,b,c,…,z,記為  p1> p2),如

」a> b」表示a比b高。 

請編一程式,根據所得到的比較結果求出一種符合條件的排隊方案。 

(注:比較結果中沒有涉及的士兵不參加排隊) 

輸入要求 

比較結果從文字檔案中讀入(檔案由鍵盤輸入),每個比較結果在文字檔案中佔一行。 

輸出要求 

若輸入資料無解,列印「no answer!」資訊,否則從高到矮一次輸出每乙個士兵的編號,

樣例輸入 

a>b 

b>d 

f>d 

樣例輸出 

afbd

二、個人理解

可能是從題目聯想到用拓撲排序解決比較困難一丟....兩次都在考試中不會寫,充分說明了自己的渣了......

如何儲存大小關係是其中的乙個突破點吧===>圖就是鄰接矩陣或者鄰接表。

拓撲排序的思想大概就是:找到入度為零的頂點,將其刪除,並且將頂點對應的邊也刪除。重複以上步驟。

三、解答(沒有提交oj測試的.....)

#includeusing namespace std; 

queueque;

int exist[100]=; //為啥是100呢,'a'-'z'的對應數值是65-90

vectoredge[100];

int indegree[100]=;

int result[100]=;

void init()

while(!que.empty())

}int main()

if(exist[b]==0)

//儲存a,b兩條邊的關係

edge[a].push_back(b);

indegree[b]++;

} //找出入度為零的點

for(int j='a';j<='z';j++)

} //入度為零的點不為空的時候,取出其中一點,將其作為較大的一點,並將其指向的其他的點的邊去掉,

//若去掉後為該點的入度為0,則將該點也放進佇列中去。

int index=0;

while(!que.empty())

} }//如果輸入的點的總數 與 能夠排隊的結果的總數一致,

//則說明存在這樣子的乙個排隊序列,否則不存在

if(count==index)

}else

cout

}

士兵排隊問題 拓撲排序

演算法提高 士兵排隊問題 時間限制 1.0s 記憶體限制 256.0mb 試題 有 個士兵 1 26 編號依次為 佇列訓練時,指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,只能獲得 p1比p2高 這樣的比較結果 p1 p2 記為 p1 p2 如 表示 比 高。請編...

藍橋 士兵排隊問題 拓撲排序

演算法提高 士兵排隊問題 時間限制 1.0s 記憶體限制 256.0mb 試題 有 個士兵 1 26 編號依次為 佇列訓練時,指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,只能獲得 p1比p2高 這樣的比較結果 p1 p2 記為 p1 p2 如 表示 比 高。請編...

士兵排隊問題 (裸的拓撲排序)

演算法提高 士兵排隊問題 時間限制 1.0s 記憶體限制 256.0mb 試題 有 個士兵 1 26 編號依次為 佇列訓練時,指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,只能獲得 p1比p2高 這樣的比較結果 p1 p2 記為 p1 p2 如 表示 比 高。請編...