社区讨论

悬关,求调!!!

P1194买礼物参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhk2ht0u
此快照首次捕获于
2025/11/04 12:27
4 个月前
此快照最后确认于
2025/11/04 12:27
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using  namespace  std;

int  p[1010], a, m;
struct  edge{
	int a, b, w;
}edges[200010];

int find(int x)
{
	if(x != p[x]) return p[x] = find(p[x]);//路径压缩 
	return  p[x];
}

bool cmp(edge a, edge b)
{
	return  a.w < b.w;
}

int  main()
{
	int k = 0;
	int num = 0;
	cin >> a >> m;
	for(int i = 1; i <= m; i ++)
	{
		for(int j = 1;j <= m; j ++)
		{
			int w;
			cin >> w;
			if(i>=j||w==0)continue; //对于重复的和本身不建边,直接过 
			//对于重复的和本身不建边,直接过 
			if(i < j && w != 0) edges[++ k] = {i, j, w};
			if(w > m) num ++;//统计优惠后的价格仍然大于原价的数目 
		}
	}
	
	//排序的时候要注意,虽然统计了价格变高的数目,但比较时还是要全部一起比
	sort(edges + 1, edges + 1 + k, cmp);
	
	for(int i = 1; i <= m; i ++) p[i] = i;
	
	int res = 0, cnt = 0;
	for(int i = 1; i <= k - num; i ++)
	{
		int a = edges[i].a, b = edges[i].b, w = edges[i].w;
		a = find(a);
		b = find(b);
		if(a != b)
		{
			p[a] = b;
			res += w;
			cnt ++;
		}
	}
	//最后判断一下是否所有的点都连了起来,如果是就加上原价;如果否加上剩余点的数目*原价 
	if(cnt == k - 1) cout << res + a;
	else cout << res + (m - cnt) * a;
	return  0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...