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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XJOI 3629 非严格次小生成树(pqq的礼物)

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XJOI 3629 非严格次小生成树(pqq的礼物) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述:

有一天,pqq準備去給×i×準備禮物,他有一些禮品準備包裝一下,他用線將這些禮物連在一起,不同的禮物因為風格不同所以連接它們需要不同價值的線。風格差異越大,價格越大(所以兩個禮物之間只有一種連接價格),當然有些禮物實在太不友好,所以有些禮物無法相連。pqq打算把所有禮物打包在一起,他不準備花太多錢,但更不想花最少的錢(免得被拒絕)。所以他想知道第二便宜的包裝方案(可重復,pqq會認為這是天命并直接選用最小代價來包裝禮物),同時,他還想知道最小的包裝代價以向×i×進行炫耀。但是由于pqq不夠心靈手巧,所以他準備找你來幫他計算答案。

?

輸入格式:

?兩個數nm表示有n個禮物,有m對禮物可以相連1n,m2?105

?接下來的m行每行三個數a,b,c,表示a禮物和b禮物可以用c的價值相連 ,?1a,bn,1c106

?

輸出格式:

輸出一行,包含兩個數,分別是最小代價和次小代價

?

樣例輸入:

5 10 1 2 1 2 3 2 3 4 3 4 5 4 1 3 5 1 4 6 1 5 7 2 4 8 2 5 9 3 5 10

?

樣例輸出:

10 11

瞎扯:我其實很好奇XiX是誰啊┐(′?`)┌

題解:其實非嚴格次小生成樹的思路還是很好理解的
首先是什么是非嚴格次小生成樹
就是樹邊和可以等于和大于最小生成樹的另一顆生成樹
假設現在要把一條非樹邊(u,v,c)加入最小生成樹,想必要去掉一條原生成樹中u->v的邊,顯然去掉最大邊效果是最好的
所以在最小生成樹上跑一個倍增DP,d[i][j]表示j的2^i次祖先到j的路徑中最大的值
顯然可以跟跳lca一樣的在logn的跳出u->v路徑上的最大值,當然樹鏈剖分也是可以搞這個東西的,但是再寫一顆線段樹還享受lognlogn的復雜度
emmmm,何必呢……
如果能跳出這個值,我們只要枚舉每一條非樹邊,就可以在nlogn的復雜度里跳出非嚴格次小生成樹,然后就A掉了

代碼如下:
#include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #define pii pair<int,int> #define mp make_pair #define int long long using namespace std;int fa[200010],vis[200010],deep[200010],n,m,f[19][250010],d[19][250010],ans1,ans2; vector<pii> g[200010]; struct line {int from,to,cost; }l[200010];int cmp(line a,line b) {return a.cost<b.cost; }void init() {for(int i=1;i<=n;i++){fa[i]=i;} }int find(int x) {if(fa[x]==x) return x;return fa[x]=find(fa[x]); }void unity(int t,int x,int y,int c) {int fx=find(x);int fy=find(y);if(fx==fy) return ;fa[fx]=fy;ans1+=c;vis[t]=1; g[x].push_back(mp(y,c));g[y].push_back(mp(x,c)); }void dfs(int now,int ff,int dist,int dep) {d[0][now]=dist;f[0][now]=ff;deep[now]=dep;for(int i=1;i<=18;i++){f[i][now]=f[i-1][f[i-1][now]];}for(int i=1;i<=18;i++){d[i][now]=max(d[i-1][now],d[i-1][f[i-1][now]]);}for(int i=0;i<g[now].size();i++){if(g[now][i].first==ff) continue;dfs(g[now][i].first,now,g[now][i].second,dep+1);} }int get(int u,int v) {int x=u,y=v;if(deep[x]<deep[y]) swap(x,y);int di=0;for(int i=18;i>=0;i--){if(deep[f[i][x]]>=deep[y]){di=max(di,d[i][x]);x=f[i][x];}}if(x==y) return di;for(int i=18;i>=0;i--){if(f[i][x]!=f[i][y]){di=max(max(d[i][x],d[i][y]),di);x=f[i][x];y=f[i][y];}}return max(di,max(d[0][x],d[0][y])); }signed main() {scanf("%lld%lld",&n,&m);init();for(int i=1;i<=m;i++){scanf("%lld%lld%lld",&l[i].from,&l[i].to,&l[i].cost);}sort(l+1,l+m+1,cmp);for(int i=1;i<=m;i++){unity(i,l[i].from,l[i].to,l[i].cost);}dfs(1,0,0,1);ans2=1e16;for(int i=1;i<=m;i++){if(!vis[i]){ans2=min(ans2,ans1+l[i].cost-get(l[i].from,l[i].to));}}printf("%lld %lld\n",ans1,ans2); }

?

?

轉載于:https://www.cnblogs.com/stxy-ferryman/p/9325557.html

總結

以上是生活随笔為你收集整理的XJOI 3629 非严格次小生成树(pqq的礼物)的全部內容,希望文章能夠幫你解決所遇到的問題。

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