cf 1076D 堆優化dij性質

2021-10-13 08:51:50 字數 1437 閱讀 5981

題意:

給你乙個n個點m條邊的無向圖,定義如果1號點到 i 號點的距離是原圖的最短距離就是好點,現在讓你最後最多只能剩k條邊,同時讓好點的個數最多,問你剩的是哪k條邊,輸出邊個數和剩下的邊的編號。

思路:

首先明確如果剩k條邊,同時要好點最多,那麼就有min(k+1,n)這麼多個好點(包括點1),因為一條邊就可以製造乙個好點,所以接下來就利用堆優化dij的性質,在隊首的那個點一定已經是最短路了,無法被鬆弛,所以只要dij裡面鬆弛的時候記錄一下之前的那條邊的編號,直到pop了min(k+1,n)個點就break,每次pop的時候記得把當前點的前一條邊加入答案(1號點不用加)。

const

int n =3*

(int

)1e5

+1000

;//點數

const i64 inf =

0x3f3f3f3f3f3f3f3fll

;int n,m,k,lst[n]

,cnt=0;

vi ans;

struct node

node

(int a, i64 b):id

(a),

w(b)

//hdu6805 美好的回憶:>

node

(int a,i64 b,

int c)

friend

bool

operator

<

(node a, node b)};

vector g[n]

;bool vis[n]

;i64 dis[n]

;void

dij(

int s,

int n)

dis[s]=0

; q.

push

(node

(s, dis[s]))

;while

(!q.

empty()

&& cnt}}

}void

init

(int n)

void

addedge

(int a,

int b,

int c,

int d)

intmain()

dij(

1, n)

; cout<<

sz(ans)

<<

'\n'

;assert(sz

(ans)

<=k)

;for

(int x:ans) cout<' ';

cout<<

'\n'

;return0;

}

CF 427D 字尾陣列

題意 求兩串字串的公共最短子串,且這個子串只在任意一串中出現一次 首先明確字尾陣列將所有的字尾 也可以視為第i個點開始的子串 字典序排列,將最近似的子串集合在一起。lcp求的是附近兩個子串的最長公共字首 如果某乙個子串當且僅當出現兩次,則必須是lcp i 是區域性最大。該子串最大長度為lcp i 最...

cf669d 觀察規律

jibancanyang author jibancanyang created time 一 4 25 01 45 31 2016 file name cf669d.cpp problem 觀察規律 get 有規律奇數偶數總是相互間隔,且奇數同奇數相對位置不變,偶數同偶數相對位置不變。說以還是要多...

CF915D 解題報告

此題目洛谷評分錯誤,根本沒有紫題難度。最開始的想法 列舉刪除的每一條邊,做一遍拓撲排序,最後直接暴力得出答案。但是,仔細分析時間複雜度 o m n m 根本過不去,所以想優化。我們可以發現,當有 x 條邊是指向 u 時,我們在上面的演算法流程中就會把每一條邊都列舉一次,列舉 x 次。但仔細想想,對於...