B: 最小代价

题解:先用最小生成树求联通所有点的最小代价ans

在求度为1的时候权值最大的点mx

ans-mx就是答案

#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
#define ll long long
using namespace std;
int p[],r[];
int n,m;
ll ans=;
vector<int>du[];//计算度
struct node
{
int x;//x,y是坐标,v是权值
int y;
int v;
}a[];
bool cmp(node b,node c)
{
return b.v<c.v;
}
int find(int x)//查找元素x的老板是谁
{
if (x == p[x])
return x;
else
return p[x] = find(p[x]);
} void join(int x, int y)//路径压缩合并两个集合
{
int xRoot = find(x);
int yRoot = find(y); if (xRoot == yRoot) //老板相同,不合并
return;
//cnt=cnt-1;
if (r[xRoot] < r[yRoot]) //r[i]是元素i所在树的高度,矮树的根节点认高树的根节点做老板
p[xRoot] = yRoot;
else if (r[xRoot] > r[yRoot])
p[yRoot] = xRoot;
else
{
p[yRoot] = xRoot;//树高相同,做老板的树高度要加一
r[xRoot]++;
}
}
void kruskal()
{
for(int i=;i<=n;i++)//初始化根节点
p[i]=i;
sort(a+,a+m+,cmp);
for(int i=;i<=m;i++)
{
if(find(a[i].x)!=find(a[i].y))
{
join(a[i].x,a[i].y);
ans=ans+a[i].v;
du[a[i].x].push_back(a[i].v);
du[a[i].y].push_back(a[i].v);
}
}
}
int main()
{
cin>>n>>m;
for(int i=;i<=m;i++)
cin>>a[i].x>>a[i].y>>a[i].v;
kruskal();
int mx=;
for(int i=;i<=n;i++)
if(du[i].size()==)//找度为一且权值最大的点
mx=max(mx,du[i][]);
cout<<ans-mx<<endl;
return ;
}

最新文章

  1. Lua 学习笔记(八)错误(error)
  2. 【腾讯GAD暑期训练营游戏程序班】游戏中的物理系统作业说明文档
  3. C# 中的委托和事件(转载)
  4. Hadoop阅读笔记(五)——重返Hadoop目录结构
  5. 【代码笔记】iOS-旋转的图片
  6. 【leetcode】Reverse Nodes in k-Group
  7. wpa_supplicant软件架构分析
  8. Horner规则
  9. 解读ECMAScript 6箭头函数
  10. 12.hibernate命名查询
  11. linux 常用端口
  12. 笔记整理——C语言-http-1
  13. Python学习--21 电子邮件
  14. L2-2. 链表去重
  15. Kubernetes1.7—DNS安装
  16. Jenkins结合.net平台综合之完整示例项目
  17. GO语言学习笔记(一)
  18. windows文件名格式的中文+数字混合字符串排序
  19. 029 c3p0的小测试
  20. 【转】LoadRunner压力测试:测试报告结果分析

热门文章

  1. Java - JVM - jinfo
  2. 结构体sizeof()问题与字节对齐
  3. angular 页面中引入静态 PDF 文件
  4. 《gPRC使用protobuf构建微服务》阅读笔记
  5. GBK与Unicode的转换
  6. 201771010135 杨蓉庆AND张燕 《面对对象程序设计(java)》第十一周学习总结
  7. STM32 MDK C 常见易错点
  8. PostgreSQL日期加减
  9. Flutter Container 组件、Text 组件详解
  10. 【原】python-jenkins信息