社区讨论
悬关,求调!!!
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 条回复,欢迎继续交流。
正在加载回复...