华师一附中OI组
标题:
P1195 口袋的天空
[打印本页]
作者:
admin
时间:
2018-7-4 08:54
标题:
P1195 口袋的天空
https://www.luogu.org/problemnew/show/P1195
题目背景
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。
有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。
题目描述
给你云朵的个数 NN ,再给你 MM 个关系,表示哪些云朵可以连在一起。
现在小杉要把所有云朵连成 KK 个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。
输入输出格式
输入格式:
每组测试数据的
第一行有三个数 N,M,K(1 \le N \le 1000,1 \le M \le 10000,1 \le K \le 10)N,M,K(1≤N≤1000,1≤M≤10000,1≤K≤10)
接下来 MM 个数每行三个数 X,Y,LX,Y,L ,表示 XX 云和 YY 云可以通过 LL 的代价连在一起。 (1 \le X,Y \le N,0 \le L<10000)(1≤X,Y≤N,0≤L<10000)
30\%30% 的数据 N \le 100,M \le 1000N≤100,M≤1000
输出格式:
对每组数据输出一行,仅有一个整数,表示最小的代价。
如果怎么连都连不出 KK 个棉花糖,请输出'No Answer'。
输入输出样例
输入样例#1:
3 1 2
1 2 1
输出样例#1:
1
说明
厦门一中YMS原创
作者:
黄煦喆
时间:
2018-8-28 22:17
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k;
long long ans;
int f[1001];
struct clouds
{
int x,y,s;
} a[10001];
bool operator< (clouds p,clouds q)
{
return p.s<q.s;
}
int getf(int x)
{
if(x==f[x])return x;
f[x]=getf(f[x]);
return f[x];
}
void merge(int a,int b)
{
int aa=getf(a);
int bb=getf(b);
f[aa]=bb;
}
int main()
{
while(cin>>n>>m>>k)
{
for(int i=1; i<=m; i++)cin>>a[i].x>>a[i].y>>a[i].s;
for(int i=1; i<=n; i++)f[i]=i;
if(n<k||n-m>k)cout<<"No Answer"<<endl;
else
{
sort(a+1,a+m+1);
int num=n;
for(int t=1;t<=m;t++)
if(num==k)break;
else if(getf(a[t].x)!=getf(a[t].y))
{
ans+=a[t].s;
merge(a[t].x,a[t].y);
num--;
}
cout<<ans<<endl;
}
}
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2