洛谷1347 排序

2021-10-12 23:32:36 字數 1768 閱讀 9347

乙個不同的值的公升序排序數列指的是乙個從左到右元素依次增大的序列,例如,乙個有序的數列 a,b,c,d 表示a若根據前 x 個關係即可確定這 n 個元素的順序 yyy…y(如 abc),輸出

sorted sequence determined after x relations: yyy…y.

若根據前 x 個關係即發現存在矛盾(如 ainconsistency found after x relations.

若根據這 m 個關係無法確定這 n 個元素的順序,輸出

sorted sequence cannot be determined.

樣例輸入:

4 6

a樣例輸出:

sorted sequence determined after 4 relations: abcd.

這道拓撲題還是比較難的。

首先,乙個最基本的思路要有:如果這些關係所構建的圖沒有環,並且存在一條能遍歷所有節點的路徑,那麼就能確定元素的排列順序。

沒有環應該很好理解,那麼後面一點又是為什麼呢?

如果這些元素存在合法的排列順序,設為:x

1

<..

.

x1x1

<..

.,將「<」看作一條邊,那麼從xn出發,顯然能遍歷所有的點。

知道了這些,下面的就比較容易了。

用拓撲排序,記錄下每個節點的深度,若n個節點的深度也分別為1~n,那麼就存在一條能遍歷所有節點的路徑(正確性請自己思考,雖然我也是瞎猜的)。

判環:拓撲排序結束後還有入度不為0的點,即有環。

#include

#include

#include

#include

using

namespace std;

const

int n=

100;

queue int,

int>

> q;

int n,m,deg[n]

,a,b,dep[n]

,du[n]

;//du記錄已經輸入的所有邊累加起來的入度,deg用來進行拓撲

bool e[n]

[n],f;

string c;

void

tuopu()

}}}int

main()

for(

int j=

1;j<=n;j++

) deg[j]

=du[j]

;for

(int j=

1;j<=n;j++)if

(!deg[j]

) q.

push

(make_pair

(j,1))

;memset

(dep,0,

sizeof

(dep));

tuopu()

; f=0;

for(

int j=

1;j<=n;j++)if

(!dep[j]

) f=1;

}if(!f)

//如果深度1~n都有節點

}printf

("sorted sequence cannot be determined.");

//上面兩種情況都不是,就必然是第三種

return0;

}

洛谷P1347 排序

這個題看到很多人寫topo排序,其實這道題第一眼看更像是乙個差分約束的裸題qwq.令dis x 表示x的相對大小 1是最小,n是最大 顯然,對於乙個關係a 而我們最後要求的就是dis x 的最小值,為了使它們的值都落在1 n之間,我們新建乙個虛擬的點0,並令dis 0 0且dis x dis 0 這...

洛谷 P1347 排序 拓撲排序

題目 乙個不同的值的公升序排序數列指的是乙個從左到右元素依次增大的序列,例如,乙個有序的數列a,b,c,d 表示a第一行有兩個整數n,m,n表示需要排序的元素數量,2 n 26,第1到n個元素將用大寫的a,b,c,d 表示。m表示將給出的形如a接下來有m行,每行有3個字元,分別為乙個大寫字母,乙個 ...

洛谷 P1347 排序 拓撲排序

乙個不同的值的公升序排序數列指的是乙個從左到右元素依次增大的序列,例如,乙個有序的數列 a,b,c,da,b,c,da,b,c,d 表示a abc d。在這道題中,我們將給你一系列形如 a a b 的關係,並要求你判斷是否能夠根據這些關係確定這個數列的順序。第一行有兩個正整數 n,mn,mn,m,n...