1. 程式人生 > >洛谷——P2121 拆地毯

洛谷——P2121 拆地毯

包含 選擇 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 拆地毯