cf536d 優先佇列的運用

2022-05-02 10:51:07 字數 1554 閱讀 5596

題目:lunar new year and a wander

題目大意:給定乙個n個頂點(編號1~n)、m條邊的圖,求從頂點1出發的字典序最小的路徑(途徑的邊可重複)。

使用乙個優先佇列就足夠了。當訪問乙個節點,我們將與之相連的、未被訪問的節點加入佇列,每次取優先佇列的隊首進行訪問。即優先佇列中存放的是當前所有可到達且未被訪問的節點(因為路徑可重複)。

時間複雜度:$\mathcal(m \log n)$

priority_queue版

1 #include2 #include3 #include4

using

namespace

std;

56 typedef long

long

ll;7

const

int maxn = 100000 + 10

;8 vectore[maxn];

9 vectorseq;

10bool

vis[maxn];

11int

n, m;

12 priority_queue, greater>q;

1314

intmain()

1524 vis[1] = true

;25 q.push(1

);26

while (!q.empty())

2737}38

}39for (int i = 0; i < seq.size(); i++)

40 printf("

%d%c

", seq[i], i == seq.size() - 1 ? '

\n' : '');

41return0;

42 }

set版(set也能排序,且這裡節點值不重複)

1 #include2 #include3 #include

4 #include5 #include6

using

namespace

std;

78 typedef long

long

ll;9

const

int maxn = 300000 + 10;10

intn, m;

11 vectorvec[maxn];

12bool

visited[maxn];

1314

intmain()

1524 vectorans;

25set

st;26 st.insert(1

);27

for (int i = 0; i < n; i++)

2839}40

int len =ans.size();

41for (int i = 0; i < len; i++) printf("

%d%c

", ans[i], i == len - 1 ? '

\n' : '');

4243

return0;

44 }

Cf1155d dp 優先佇列

列舉乘x區間的開頭i dp 2 i 表示從i往左往右最大sum 對於每個i要找max sum i j x dp 1 j 1 考慮優先佇列維護 i到i 1時是把所有的sum加上a i x,可以外部用個變數sum維護變化,每次插入乙個dp 1 j sum include include include ...

CF1042A Benches 優先佇列

題意裡讓你求的是來了m個人後人數最多的長椅上最少和最多有多少人 如果要求最多,很好辦,m個人都擠到原來人數最多的長椅上了 一眼看出 但如果要求最少呢?大家看圖 長椅某個時間的人數如圖 顯然,如果你往最高峰上放 怕不是石樂志 一定會增加答案 自然不是最優 那我們怎麼辦呢?填坑就好了 每次找見坑,把人填...

codeforces 523D 優先佇列

題意 給你n個任務單和k個機器,每個任務單有兩個變數開始的時間,完成所需要的時間,問你最優去做的話,每個訂單的結束時間是?題解 題目保證了資料是遞增排序的,那麼我們就不用sort了,直接做。然後這裡有個小套路 因為題目可以有k個機器,那我們可以先用k個0進去乙個優先佇列以達到模擬k個優先佇列的作用,...