vijos 1234 口袋的天空

最小生成树kruscal算法

#include<iostream>
#include<algorithm>
#include<cstring>
#define maxn 10005
using namespace std;
struct stu
{
	int x,y;
	int t;
};
stu mapp[maxn];
int f[1005];
int n,m,k,sum,flag;
bool cmp(stu x,stu y)
{
	return x.t<y.t;
}
int  dfs(int x)
{
	if(f[x]!=x) f[x]=dfs(f[x]);
	return f[x];
}
void build(int x)
{
	if(dfs(mapp[x].x)!=dfs(mapp[x].y))
	{
		f[dfs(mapp[x].x)]=dfs(mapp[x].y);
		sum+=mapp[x].t;
	}
}
int solve()
{
	int re=0;
	for(int i=1;i<=n;i++)
	{
		if(f[i]==i) re++;
	}
	if(re==k) return 1;
	else return 0;
}
int main()
{
	while(cin>>n>>m>>k)
	{
		for(int i=0;i<1005;i++) f[i]=i;
		sum=0;
		flag=0;
		for(int i=0;i<m;i++) cin>>mapp[i].x>>mapp[i].y>>mapp[i].t;
		sort(mapp,mapp+m,cmp);
		for(int i=0;i<m;i++)
		{
			build(i);
			if(solve())
			{
				flag=1;
				cout<<sum<<endl;
				break;
			}
		}
		if(!flag) cout<<"No Answer"<<endl;
	}
	return 0;
} 
时间: 2024-12-28 15:09:54

vijos 1234 口袋的天空的相关文章

vijos P1234口袋的天空(Kruskal)(最小生成树)

P1234口袋的天空 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把一些云朵连在一起,做成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 格式 输入格式 每组测试数据的 第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10) 接下来M个数每行三个数

Vijos:P1234口袋的天空

背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把一些云朵连在一起,做成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 格式 输入格式 每组测试数据的第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10)接下来M个数每行三个数X,Y,L,表示X云

【最小生成树】口袋的天空

口袋的天空 背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把一些云朵连在一起,做成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 格式 输入格式 每组测试数据的第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10)接下来M个数每行三个数X,Y,

P1195 口袋的天空

P1195 口袋的天空 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 输入输出格式 输入格式: 每组测试数据的 第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10) 接下来

洛谷P1195 口袋的天空 并查集

洛谷P1195 口袋的天空 并查集 将边从小到大排序,然后依次加边 看看是否能变成 K 个连通块,以及其最小话费 1 #include <cstdio> 2 #include <algorithm> 3 #define For(i,j,k) for(int i=j;i<=k;i++) 4 using namespace std ; 5 6 const int N = 1011,M = 10011,inf = 1e9 ; 7 struct edge{ 8 int x,y,val

luoguP1195 口袋的天空 x

P1195 口袋的天空 378通过 867提交 题目提供者该用户不存在 标签 云端 难度 普及+/提高 时空限制 1s / 128MB 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 输入输出格式 输入格式: 每组测试数据的 第一行有三个

洛谷P1195 口袋的天空

口袋的天空 327通过 749提交 题目提供者该用户不存在 标签云端 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 暂时没有讨论 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 输入输出格式 输入

口袋的天空洛谷并查集

题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 输入输出格式 输入格式: 每组测试数据的 第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10) 接下来M个数每行三个数X,Y,

洛谷 P1195 口袋的天空

题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 输入输出格式 输入格式: 每组测试数据的 第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10) 接下来M个数每行三个数X,Y,