藍橋訓練 拓撲排序

2021-10-04 18:17:16 字數 1200 閱讀 2751

有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 如 表示 比 高。請編...