優先佇列實現字典序最小的拓撲排序

2021-10-19 13:38:37 字數 2007 閱讀 8807

煩人的依賴

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

題目描述

ubuntu20.04 正式發布了,zls 是乙個作死小能手,於是他決定嘗試一下這個船新版本。好不容易裝完系統,zls 想要給他的系統裝一些常用的軟體。眾所周知,在 linux 裝軟體會遇到各種奇奇怪怪的依賴問題(所謂依賴問題就是若a依賴b,則b要先與a安裝)。zls 對此不厭其煩,因此他想知道他要用什麼順序安裝軟體,可以一次安裝成功呢?

tips: zls 還有乙個癖好,他喜歡先安裝字典序小的軟體。

輸入描述:

第一行包含乙個正整數 t 表示資料組數。

每組資料的第一行包 n 和 m, 表示有 n 個軟體,m 個依賴關係。

接下來的一行包含 n 個軟體名(軟體名僅包含小寫字母 a-z )

接下來的 m 行每行有兩個軟體名 s 和 t,表示 t 依賴 s ,即 s 要在 t 之前安裝。

資料保證: 1 \le t \le 51≤t≤5

1 \le n \le 3 \times 10^, 1 \le m \le 10^1≤n≤3×10

4,1≤m≤10

51 \le |s|,|t| \le 101≤∣s∣,∣t∣≤10

輸出描述:

共 t 組輸出,每組輸出先輸出一行 case #%d: ,%d 替換為當前輸出的組數。

接下來是 n 行,按照安裝的順序輸出。

如果無法進行安裝,輸出 impossible (注意大小寫)。

示例1輸入複製2

4 2a b c d

a bb c

3 3a b c

a bb c

c a輸出

複製case #1:ab

cdcase #2:

impossible

我們輸出的順序就是拓撲排序,只是要求是字典序最小,那麼就將佇列用優先佇列替換即可,然後我們需要將各個字元對映成乙個個結點,按照從小到大的順序排序,然後在編號,然後拓撲排序一遍即可。

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1e6;

int ru[maxn]

;int grp[

3005][

3005];

int ans[maxn]

;vector<

int>res;

vector<

int>edge[

30005];

//queueq;

//priority_queue,greater>q;

priority_queue<

int> q;

string st[maxn]

;//unordered_mapst1;

mapint>st1;

int jl=0;

voidcl(

int n)

intmain()

sort

(st+

1, st+n+

1, greater()

);for(

int i=

1;i<=n;i++

) st1[st[i]

]=i;

for(

int i=

1;i<=m;i++

)for

(int i=

1;i<=n;i++

)while

(!q.

empty()

)}}cout<<

"case #"

<<

++jl<<

":"

size()

cout<<

"impossible"

}}

Codevs P1076 排序 優先佇列

題目描述 description 給出n和n個整數,希望你從小到大給他們排序 輸入描述 input description 第一行乙個正整數n 第二行n個用空格隔開的整數 輸出描述 output description 輸出僅一行,從小到大輸出n個用空格隔開的整數 樣例輸入 sample input...

最小的字典序

題目 給定乙個字串型別的陣列strs,找到一種拼接方式,使得把所有字 符串拼起來之後形成的字串具有最低的字典序。如 ab cd ef 則拼接後的最低字典序是 abcdef 這裡重點是選擇什麼樣的貪心策略 public class dictsort public static string lowes...

優先佇列的實現(最小堆)

定義上浮函式和下浮函式,對每一次加入的新節點,重新維護最小堆 public class priorityminqueue public priorityminqueue 初始化優先佇列 param capacity public priorityminqueue int capacity else ...