有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
解題思路:看了題解才明白這道題是裸拓撲排序,從個子高到個子矮的序列,那麼每次輸入都從個子高的點到個子矮的點加一條邊,如果這條邊之前有就不用加了(這題的坑點),把度為0的點加進去,刪去該點,把度為0的點加進去,如果圖中有環就無解,邊的數量少於n-1的都無解。
#include#include#include#include#include#include#include#include#include#define il inline
#define x first
#define y second
typedef long long ll;
using namespace std;
const int n=28;
int g[n][n];
int duin[n];
bool st[n];
bool st2[n];
char res[n];
queueq;
int main()
for(int i=1;i<=26;i++)
if(!duin[i]&&st2[i]&&!st[i])
while(q.size())}}
int tt=0;
for(int i=1;i<=26;i++)
if(st2[i])
tt++;
if(tt==cnt)
for(int i=0;icout
cout<<"no answer!";
cout
}
訓練六 拓撲排序演算法
1.目的要求 1 構造有向無環圖dag directed acyclic graph 2 理解什麼是拓撲序列 2 利用拓撲排序演算法解決online judge上面的題目 2.實驗內容 1 給定乙個工程圖,按照拓撲序列將工程序列進行重新排序輸出 hdu1285 3.實驗報告 1 include in...
CSL的訓練計畫 拓撲排序
題目保證了不會有環。一開始唯一能確定的乙個點便是入度為0的點,確定了乙個點自然而然可以推出其他點。a 1 r1 k a 1 r1 k r2 k a1 r1 k r 2 k r3 k su ma 1 r 1 k a 1 r 1 k r 2 k a 1 r 1 k r 2 k r 3 k sum a1 ...
藍橋 士兵排隊問題 拓撲排序
演算法提高 士兵排隊問題 時間限制 1.0s 記憶體限制 256.0mb 試題 有 個士兵 1 26 編號依次為 佇列訓練時,指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,只能獲得 p1比p2高 這樣的比較結果 p1 p2 記為 p1 p2 如 表示 比 高。請編...