洛谷——P2121 拆地毯
阿新 • • 發佈:2017-12-25
包含 選擇 col char tin tdi 早已 背景 允許
P2121 拆地毯
題目背景
還記得 NOIP 2011 提高組 Day1 中的鋪地毯嗎?時光飛逝,光陰荏苒,三年過去了。組織者精心準備的頒獎典禮早已結束,留下的則是被人們踩過的地毯。請你來解決類似於鋪地毯的另一個問題。
題目描述
會場上有 n 個關鍵區域,不同的關鍵區域由 m 條無向地毯彼此連接。每條地毯可由三個整數 u、v、w 表示,其中 u 和 v 為地毯連接的兩個關鍵區域編號,w 為這條地毯的美麗度。
由於頒獎典禮已經結束,鋪過的地毯不得不拆除。為了貫徹勤儉節約的原則,組織者被要求只能保留 K 條地毯,且保留的地毯構成的圖中,任意可互相到達的兩點間只能有一種方式互相到達。換言之,組織者要求新圖中不能有環。現在組織者求助你,想請你幫忙算出這 K 條地毯的美麗度之和最大為多少。
輸入輸出格式
輸入格式:
第一行包含三個正整數 n、m、K。
接下來 m 行中每行包含三個正整數 u、v、w。
輸出格式:
只包含一個正整數,表示這 K 條地毯的美麗度之和的最大值。
輸入輸出樣例
輸入樣例#1: 復制5 4 3 1 2 10 1 3 9 2 3 7 4 5 3輸出樣例#1: 復制
22
說明
選擇第 1、2、4 條地毯,美麗度之和為 10 + 9 + 3 = 22。
若選擇第 1、2、3 條地毯,雖然美麗度之和可以達到 10 + 9 + 7 = 26,但這將導致關鍵區域 1、2、3 構成一個環,這是題目中不允許的。
1<=n,m,k<=100000
最小生成樹模板
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 100010 using namespace std; int n,m,k,x,y,fx,fy,ans,sum,fa[N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int find(int x) { if(x==fa[x]) return x; fa[x]=find(fa[x]); return fa[x]; } struct Node { int x,y,z; }node[N]; int cmp(Node a,Node b) { return a.z>b.z; } int main() { n=read(),m=read(),k=read(); for(int i=1;i<=m;i++) { fa[i]=i; node[i].x=read(); node[i].y=read(); node[i].z=read(); } sort(node+1,node+1+m,cmp); for(int i=1;i<=m;i++) { x=node[i].x,y=node[i].y; fx=find(x),fy=find(y); if(fx==fy) continue; fa[fx]=fy,sum++; ans+=node[i].z; if(sum==k) break; } printf("%d",ans); return 0; }
洛谷——P2121 拆地毯