ZCMU 2103士兵排隊問題(拓撲排序)

2021-10-19 15:16:40 字數 1718 閱讀 1889

題目鏈結

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

此題由部分排序求全體排序,且排序結果可能有多種。

在圖論中,對於指明事件的優先次序問題都使用有向無環圖,對有向無環圖進行拓撲排序,即可得到圖中所有結點的一種線性次序。

由拓撲排序得到的線性次序滿足如下條件:

如果圖g包含邊(u,v),則結點u在拓撲排序中處於結點v的前面(如果圖g包含環路,則不可能排出乙個線性次序)

可以將圖的拓撲排序看做是將圖的所有結點在一條水平線上排開,圖的所有有向邊都從左指向右。(詳見《演算法導論》拓撲排序)

此題顯然便是求某圖的拓撲排序次序,我們將輸入的「比較結果」,如:a>b,記為圖的一條邊,便得到了一張圖。隨後對該圖進行拓撲排序,但此題並非簡單的拓撲,還要求所得結果字典序最小,故還需借助優先佇列,先對字典序小的結點進行操作。

關於拓撲排序的實現,可以參照相關部落格。

【**如下】

#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的值才能使士兵們以最少...