題意:
給你乙個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 次。但仔細想想,對於...