拆地毯

 这个就是套用最小生成树的模板,只不过要将sort函数改成从大到小进行排序。然后这个退出条件是只要大于k就退出。
 代码如下
  
#include<iostream>
#include<cmath>
#include<algorithm>
#define N 1009000
using namespace std;
int n,m,k;
struct node
{
	int x, y;
	int z;
}q[N];
int fa[N];
int cha(int x)
{
	return fa[x] == x ? x : fa[x] = cha(fa[x]);
}
void Union(int x, int y)
{
	x = cha(x);
	y = cha(y);
	if (x == y) return;
	if(x!=y)
	{
		fa[x] = y;
	}
}
bool cmp(node x, node y)
{
	return x.z > y.z;
}
int main()
{
	
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++)
	{
		cin>>q[i].x>>q[i].y>>q[i].z;
	}
	for (int i = 1; i <= N - 10; i++)
	{
		fa[i] = i;
	}
	sort(q + 1, q + 1 + m, cmp);
	int ans=0;
	int tmp=0;
	for (int i = 1; i <= m; i++)
	{
		if(cha(q[i].x)!=cha(q[i].y))
		{
			Union(q[i].x,q[i].y);
			ans+=q[i].z;
			tmp++;
			if(tmp>=k)
			{
				printf("%d\n",ans);
				return 0;
			}
		}
	}
	return 0;
}营救

这题也是最小生成树的模板,只需要将设置一个打擂台的模板,将每一次比较的最大值记录下来就可以了
 代码如下
#include<iostream>
#include<algorithm>
#define N 1000000
using namespace std;
int fa[N];
struct node
{
	int x,y,z;
}q[N];
bool cmp(node x,node y)
{
	return x.z<y.z;
}
int cha(int x){
	return fa[x]==x?x:fa[x]=cha(fa[x]);
}
void Union(int x,int y)
{
	x=cha(x);
	y=cha(y);
	if(x==y)return ;
	else
	{
		fa[x]=y;
	}
}
int n,m,s,t;
int main()
{
	int ans=0;
	cin>>n>>m>>s>>t;
	for(int i=1;i<=N-10;i++)
	fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		cin>>q[i].x>>q[i].y>>q[i].z;
	}
	sort(q+1,q+1+m,cmp);
	for(int i=1;i<=m;i++)
	{
		if(cha(q[i].x)!=cha(q[i].y))
		{
			Union(q[i].x,q[i].y);
			ans=max(ans,q[i].z);
			if(cha(s)==cha(t))
			{
				cout<<ans<<endl;
				return 0;
			}
		}
	}
	return 0;
}
                      



















