洛谷 P1347 排序 拓撲排序

2021-10-12 06:51:40 字數 2267 閱讀 8740

乙個不同的值的公升序排序數列指的是乙個從左到右元素依次增大的序列,例如,乙個有序的數列 a,b,c,da,b,c,da,

b,c,

d 表示a

abc<

d。在這道題中,我們將給你一系列形如 a

a<

b 的關係,並要求你判斷是否能夠根據這些關係確定這個數列的順序。

第一行有兩個正整數 n,mn,mn,

m,nn

n 表示需要排序的元素數量,2≤n≤262\leq n\leq 262≤

n≤26

,第 11

1 到 nn

n 個元素將用大寫的 a,b,c,d…a,b,c,d\dotsa,

b,c,

d…表示。mm

m 表示將給出的形如 a

a<

b 的關係的數量。

接下來有 mm

m 行,每行有 33

3 個字元,分別為乙個大寫字母,乙個<符號,乙個大寫字母,表示兩個元素之間的關係。

若根據前 xx

x 個關係即可確定這 nn

n 個元素的順序yyy..y(如abc),輸出

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

若根據前 xx

x 個關係即發現存在矛盾(如 a

abc<

a),輸出

inconsistency found after x relations.

若根據這 mm

m 個關係無法確定這 nn

n 個元素的順序,輸出

sorted sequence cannot be determined.n

個元素的順序後即可結束程式,可以不用考慮確定順序之後出現矛盾的情況)

輸入 #1複製

4 6

a輸出 #1複製sorted sequence determined after 4 relations: abcd.

輸入 #2複製

3 2

a輸出 #2複製inconsistency found after 2 relations.

輸入 #3複製

26 1

a輸出 #3複製sorted sequence cannot be determined.

2≤n≤26,1≤m≤6002 \leq n \leq 26,1 \leq m \leq 6002≤

n≤26

,1≤m

≤600

#include

#include

#include

#include

#include

using

namespace std;

unordered_set<

int>

::iterator it;

int n, m;

int in[26]

;// 統計入度

int cnt =0;

// 統計數目,判斷是否可以完成

vector<

int> edge[26]

;// 統計邊的數目

bool

judge

(int u,

int v)

}return

false;}

vector<

char

>

sort

(unordered_set<

int> s)

// 若同時存在兩個沒有入度的點那麼這兩個點的的大小關係便無法判斷

while

(q.size()

==1)}

ans.

push_back

(now);}

return ans;

}int

main()

else

if(uset.

size()

== n)}}

cout <<

"sorted sequence cannot be determined."

<< endl;

return0;

}

洛谷 P1347 排序 拓撲排序

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

洛谷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...