拓撲排序解決ABC比較大小問題

2021-10-24 07:45:11 字數 2287 閱讀 2417

abc

有三個數,分別用a,b,c表示,告訴你他們的兩兩比較的結果,輸出他們的大小關係。input輸入的資料有多組,每組資料有三行,每行有兩個字母,表示前面的字母代表的數比後面的字母代表的數大,每行的兩個字母不相同。output如果他們比較的結果合法,那麼把它們按照從小到大的順序輸出,兩個字母中間應有「<」號,否則就輸出「the input is not true!」,輸出佔一行。

sample input

abbc

acab

baac

sample output

c既然是字母比較,那麼拓撲排序就能很好解決這個問題。為什麼?

因為拓撲排序是有向無環圖,他的實質是對有向圖的頂點排成乙個線性序列。簡單來說。由某個集合上的乙個偏序得到該集合上的乙個全序,這個操作稱之為拓撲排序。

回到問題,我們需要的結果恰好就是乙個序列,我們的輸入可以看作是拓撲排序給定的先後順序。且當成環時(ab bc ca),就會無法拓撲排序也就是abc無法比較。

那麼怎麼排序呢?

首先我們需要處理輸入的資料,就拿ab bc ac舉例子

ab相當於 a>b,由於我們的輸出是從小到大

所以,姑且想象成b->a(此時a的入度需要+1,拓撲排序根據入度依次刪除節點)

同時記錄下b的可去的乙個節點增加乙個a

同理bc 就是b的入度+1,c的可去的乙個節點增加乙個b

最後ac 就是a的入度+1,c的可去的乙個節點增加乙個a

然後開始進行拓撲排序

現在a的入度為2,b的入度為1,c的入度為0

找到c,刪去它,並且找到它的可去的節點(c->a 和c->b)使a,b入度-1;

現在a的入度為1,b的入度為0,c已被處理

找到b,刪去它,並且找到它的可去的節點(b->a)使a入度-1;

現在a的入度為0,b已被處理,c已被處理

找到a,刪去它,發現他沒有可去的節點,那麼抵達末尾,迴圈結束;

因為有三個節點,所以如果我們迴圈三次說明是正確的。

然後按照刪除節點的順序列印c->b->a即可

以上便是

正常結果的情況

下面看看如果不是正確結果的情況

如果沒有迴圈三次,說明他可能成環了,(ab ba ac)

經過上面同理處理,a入度為2,可去節點為b;b入度為1,可去節點為a; c入度為0可去節點為a

那麼先刪去c,然後使a入度-1,那麼此時無入度為0的點跳出迴圈。

你可能會問若第三條不是ac而是bc呢?那會變成b的入度為2,然後先刪c,b入度-1,還是沒有入度為0的點。

接下來我們考慮一下特殊輸入,比如ab出現兩次,那麼我們就需要讓多餘的資料不處理

還有就是乙個節點指向兩個節點,另外兩個節點不知道順序的情況(ab ab cb)b入度為0,但是ac入度均為1.所以沒有入度為2的節點需要提前結束迴圈判為錯誤,因為我們的題目需要保證abc存在絕對比較性

#include

#include

using

namespace std;

struct abce[3]

;//abc分別對應三個點

queue q;

char res[4]

;bool

used

(vector<

int> v,

int x)

//判斷vector是否存在x

}return

false;}

intmain()

if(!used

(e[z[1]

-'a'

].v,z[0]

-'a'))

for(

int i=

0;i<

3;i++

)//獲取入度為0的字母

}int sum=0;

while

(!q.

empty()

)//bfs

for(vector<

int>

::iterator i=temp.v.

begin()

;i!=temp.v.

end(

);i++)}

if(sum==3)

//如果有三次則說明ok

else

for(

int i=

0;i<

3;i++

)//重置e

}}

mysql中datetime比較大小問題

select sum studychj as tofflinejz from afterline where checkflag 1 and studytype 1 and studybegin 2010 01 01 00 00 00 and studyend 2010 12 01 00 00 00...

mysql中datetime比較大小問題

select sum studychj as tofflinejz from afterline where checkflag 1 and studytype 1 and studybegin 2010 01 01 00 00 00 and studyend 2010 12 01 00 00 00...

mysql中datetime比較大小問題 轉的

方法一 你也可以 select from t1 where unix timestamp time1 unix timestamp 2011 03 03 17 39 05 and unix timestamp time1 unix timestamp 2011 03 03 17 39 52 就是用u...