如果爆0
  • 板块P2121 拆地毯
  • 楼主ilm666
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/13 16:11
  • 上次更新2023/11/13 18:40:17
查看原帖
如果爆0
570217
ilm666楼主2023/11/13 16:11

### 最多k条边

所以要判断是否连接边数过多

(百给小剧场)

#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k;
struct tz
{
	int from,to,value;
}l[100005];
bool cmp(tz a,tz b)
{
	return a.value>b.value;
}
int p[100005];
int f(int x)
{
	if(p[x]!=x)
	{
		return f(p[x]);
	}
	else
	{
		return p[x];
	}
}
long long k()
{
	long long ans = 0;

	for(int i = 1;i<=m;i++)
	{
		int a = f(l[i].from),b = f(l[i].to);
		if(a!=b)
		{
			ans+=l[i].value;
			p[a] = b;
		}
	}
	return ans;
}
int main()
{
	cin>>n>>m>>k;
	for(int i = 1;i<=n;i++)
	{
		p[i] = i;
	}
	for(int i = 1;i<=m;i++)
	{
		cin>>l[i].from>>l[i].to>>l[i].value;
	}
	sort(l+1,l+1+m,cmp);
	cout<<k();
}

错误但可过样例

result like this

(实际上加个判断连接点数>k直接停掉的变量就可A)

即:在k()中加一个变量,初始1连一条边加一,大于k时break

输出ans

笔记:生成树+判断

最后 A了

2023/11/13 16:11
加载中...