題目鏈結
description此題由部分排序求全體排序,且排序結果可能有多種。有n個士兵(1≤n≤26),編號依次為 a,b,c,…,佇列訓練時,指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,只能獲得「p1比p2高」這樣的比較 結果(p1、p2∈a,b,c,…,z,記為 p1>p2),如」a>b」表示a比b高。
請編一程式,根據所得到的比較結果求出一種字典序最小的排隊方案。
(注:比較結果中沒有涉及的士兵不參加排隊)
input
比較結果從文字檔案中讀入(檔案由鍵盤輸入),每個比較結果在文字檔案中佔一行。
output
若輸入資料無解,列印「no answer!」資訊,否則從高到矮一次輸出每乙個士兵的編號,中間無分割符,並把結果寫入文字檔案中,檔案由鍵盤輸入
sample input
a>b
b>d
f>d
sample output
abfd
在圖論中,對於指明事件的優先次序問題都使用有向無環圖,對有向無環圖進行拓撲排序,即可得到圖中所有結點的一種線性次序。
由拓撲排序得到的線性次序滿足如下條件:此題顯然便是求某圖的拓撲排序次序,我們將輸入的「比較結果」,如:a>b,記為圖的一條邊,便得到了一張圖。隨後對該圖進行拓撲排序,但此題並非簡單的拓撲,還要求所得結果字典序最小,故還需借助優先佇列,先對字典序小的結點進行操作。如果圖g包含邊(u,v),則結點u在拓撲排序中處於結點v的前面(如果圖g包含環路,則不可能排出乙個線性次序)
可以將圖的拓撲排序看做是將圖的所有結點在一條水平線上排開,圖的所有有向邊都從左指向右。(詳見《演算法導論》拓撲排序)
關於拓撲排序的實現,可以參照相關部落格。
【**如下】
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
1e3+10;
vector<
int>p[maxn]
;priority_queue<
int,vector<
int>
,greater<
int>
>q;
//優先序列(小頂堆)
int vis[maxn]
,ans[maxn]
,in[maxn]=;
intmain()
for(
int i=
0;i<
26;i++
)int cnt=0;
while
(!q.
empty()
)}for(
int i=
0;i<
26;i++)}
for(
int i=
0;i)return0;
}
相似題目:解法一致,均為拓撲排序 2103 士兵排列問題 ZCMU
題目描述 有 個士兵 1 26 編號依次為 佇列訓練時,指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,只能獲得 p1比p2高 這樣的比較 結果 p1 p2 記為 p1 p2 如 表示 比 高。請編一程式,根據所得到的比較結果求出一種字典序最小的排隊方案。注 比較結...
士兵排隊問題 拓撲排序
演算法提高 士兵排隊問題 時間限制 1.0s 記憶體限制 256.0mb 試題 有 個士兵 1 26 編號依次為 佇列訓練時,指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,只能獲得 p1比p2高 這樣的比較結果 p1 p2 記為 p1 p2 如 表示 比 高。請編...
分治法 士兵排隊問題
在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點用整數座標 x,y 表示。士兵們可以沿網格邊往上 下 左 右移動一步,但在同一時刻任一網格點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成 x,y x 1,y x n 1,y 如何選擇x和y的值才能使士兵們以最少...