題目:lunar new year and a wander
題目大意:給定乙個n個頂點(編號1~n)、m條邊的圖,求從頂點1出發的字典序最小的路徑(途徑的邊可重複)。
使用乙個優先佇列就足夠了。當訪問乙個節點,我們將與之相連的、未被訪問的節點加入佇列,每次取優先佇列的隊首進行訪問。即優先佇列中存放的是當前所有可到達且未被訪問的節點(因為路徑可重複)。
時間複雜度:$\mathcal(m \log n)$
priority_queue版
1 #include2 #include3 #include4using
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 #include4 #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個優先佇列的作用,...