洛谷 P1347 排序 拓撲排序

2021-10-09 06:32:18 字數 2206 閱讀 4517

題目

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

若根據前x個關係即可確定這n個元素的順序yyy…y(如abc),輸出

sorted sequence determined after *** relations: yyy…y.

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

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

sorted sequence cannot be determined.

輸入 #1

4

6aabcba

sorted sequence determined after 4 relations: abcd.
輸入 #2

3

2ab

inconsistency found after 2 relations.
輸入 #3

26

1a

sorted sequence cannot be determined.
拓撲排序每次輸入乙個關係就做一次

一共會出現3

33種情況 最後分別判斷就可以了

1.

1 .1.

判斷矛盾其實就是是否出現根據判斷輸出情況2

22(題目)

2.

2 .2.

拓撲把度清零 找出最長鏈如果最長鏈小於n

nn 則沒有關係

反之 則輸出情況1

11(題目)

3.

3 .3.

根據這m

mm個關係無法確定這n

nn個元素的順序 則為情況3

33(題目)

每次輸入要判斷a

aa與c

cc是否重複會出現矛盾

#include

#include

#include

#include

#include

using

namespace std;

int d[

100010

],f[

100010

],h[

100010

],p[

100010

],v[

100010

],ans[

10010

],len;

int n,m,tot,head,tail;

char x,y,z;

struct node

a[100010];

void

add(

int x,

int y)

;//鄰接表

h[x]

=tot;

}void

topsort()

//拓撲排序

while

(head}int

main()

add(x-

64,z-64)

;//轉換數字

f[z-64]

++;topsort()

;if(len==n)

//情況1

for(

int j=

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

}printf

("sorted sequence cannot be determined.");

//都不是情況3

return0;

}

洛谷 P1347 排序 拓撲排序

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

洛谷P1347 排序

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

P1347 排序(拓撲排序)

題目傳送門 這題雖然是一道藍題,但他的資料很小,所以,我們可以每輸入乙個關係就拓撲一次 我們可以把結果分為三種情況 這裡我們可以用拓撲把度清零,記錄每個字母都出現過 並且判斷最長的鏈是多少就行了 即f a i to max f a i to f p h 1 找最長鏈 s max s,f a i to...