日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

codeforces773 D. Perishable Roads(思维+最短路)

發布時間:2023/12/3 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces773 D. Perishable Roads(思维+最短路) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

D. Perishable Roads

題意簡述: 一個 nnn 個點的完全圖 以 iii 為根節點時

詢問 能構造的樹的 ∑d(x)\sum d(x)d(x) 最小是多少。

d(x)d(x)d(x)xxx 到根節點邊權值最小值

MOONPIE題解


首先有一個顯而易見的錯誤貪心:

不妨假設以root\text{root}root為根節點重構樹,定義u→vu\to vuv這條路徑是所有路徑的最小值,則我們肯定希望這樣構造路徑:
root→u→v?others\text{root}\to u\to v\leadsto \text{others}rootuv?others
也就是把其他所有點都往vvv上連(構成一棵樹),這樣其他點的代價都是wu→vw_{u\to v}wuv?,不難得出所求為wroot→u+(n?2)×wu→vw_{\text{root}\to u}+(n-2)×w_{u\to v}wrootu?+(n?2)×wuv?
容易想到反例也就是如果wroot→uw_{\text{root}\to u}wrootu?非常非常大,則會不是最優值!!!

不過我們只需要找到一條路徑root?u\text{root}\leadsto uroot?u 代替root→u\text{root}\to urootu,不難想到答案一定是這種情況:root?u→v?others\text{root}\leadsto u\to v\leadsto \text{others}root?uv?others(其中root?u\text{root}\leadsto uroot?u是一條鏈而v?othersv\leadsto \text{others}v?others是一棵樹)


對于鏈上路徑的值有一個結論(詳細可查看RingweEH):

root→?→i→j→k→u→v\text{root}\to\dots\to i\to {j}\to k\to u\to vroot?ijkuv
這條鏈上的邊權一定單調遞減且只可能存在一例例外(即有可能wi→j≤wk→uw_{i\to j}\leq w_{k\to u}wij?wku?

對于計算答案來說,樹上的點v?othersv\leadsto \text{others}v?others對答案的貢獻是(n?1?x)×wu→v(n-1-x)×w_{u\to v}(n?1?x)×wuv?而鏈上的點由于單調遞減,只需要從root\text{root}root跑一邊最短路即可由于不知道鏈上邊的個數xxx只需要利用花費提前的思想,跑最短路前把每條邊減去wu→vw_{u\to v}wuv?即可,對于例外情況特殊考慮一下即可。

#include<cstring> #include<iostream> #include<algorithm> using namespace std; using ll=long long; constexpr int N=2010; int g[N][N],n; ll d[N]; bool st[N]; void dijkstra(int S) {memset(d,0x3f,sizeof d);memset(st,0,sizeof st);d[S]=0;for(int i=1;i<=n;i++)//例外for(int j=1;j<=n;j++)d[i]=min(d[i],g[i][j]*2ll);for(int i=1;i<=n;i++){int t=-1;for(int j=1;j<=n;j++)if(!st[j]&&(t==-1||d[t]>d[j])) t=j;st[t]=1;for(int j=1;j<=n;j++) d[j]=min(d[j],d[t]+g[t][j]);} }int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n;int S=1,mn=0x3f3f3f3f;memset(g,0x3f,sizeof g);for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++){cin>>g[i][j];g[j][i]=g[i][j];if(mn>g[i][j]) mn=g[i][j],S=i;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) g[i][j]-=mn;dijkstra(S); for(int i=1;i<=n;i++) cout<<1ll*(n-1)*mn+d[i]<<'\n'; }

要加油哦~

總結

以上是生活随笔為你收集整理的codeforces773 D. Perishable Roads(思维+最短路)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。