博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[USACO08NOV]安慰奶牛Cheering up the Cow
阅读量:4992 次
发布时间:2019-06-12

本文共 1396 字,大约阅读时间需要 4 分钟。

这个题一看就是最小生成树,但是这题关键是确定边权。

首先为了安慰奶牛,一定要遍历每个奶牛并且回到起点,所以每条边会被经过两次,而为了通过这条边必须和两端点奶牛谈话,因此要再加上两端点的c值。综上(i,j)边权为l(i,j)  * 2 + c_i + c_j。

#include
#include
#include
#include
#define N 10010#define M 10000000using namespace std;int n,m;struct qwq{ int x,y,val; bool operator < (const qwq &a) const { return val < a.val; }}e[M];int fa[N],siz[N];int find(int x){ if(fa[x] != x) fa[x] = find(fa[x]); return fa[x];}void merge(int x,int y){ if(siz[x] > siz[y]) swap(x,y); siz[y] += siz[x]; fa[x] = y; return;}int kruskal(){ sort(e + 1,e + 1 + m); int tot = 0,ans = 0; for(int i = 1;i <= m;i++) { int x = find(e[i].x),y = find(e[i].y); if(x != y) { merge(x,y); ans += e[i].val; tot++; } if(tot == n - 1) break; } return ans;}int c[N];using namespace std;int main(){ scanf("%d %d",&n,&m); int minn = 1000000; for(int i = 1;i <= n;i++) { scanf("%d",&c[i]); minn = min(c[i],minn); fa[i] = i; siz[i] = 1; } for(int i = 1;i <= m;i++) { scanf("%d %d %d",&e[i].x,&e[i].y,&e[i].val); e[i].val = (e[i].val << 1) + c[e[i].x] + c[e[i].y]; } printf("%d\n",kruskal() + minn); return 0;}

 

转载于:https://www.cnblogs.com/lijilai-oi/p/10939755.html

你可能感兴趣的文章
ctci1.2
查看>>
[译]RabbitMQ教程C#版 - 路由
查看>>
升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署
查看>>
Android:onNewIntent()触发机制及注意事项
查看>>
珠宝公司之感想
查看>>
项目问题
查看>>
scss侦听并压缩
查看>>
我有接口文档, 你有酒吗?
查看>>
iOS - Push 通知推送
查看>>
[FJOI2007]轮状病毒
查看>>
Azure AADSTS7000215 其中一种问题的解决
查看>>
关于吃苦
查看>>
uva 1629切蛋糕(dp)
查看>>
生成awr报告
查看>>
cocos2d-x 3.0rc2 对于每个包执行情况的重要平台 (超级方便)
查看>>
Android 深入解析光传感器(二)
查看>>
Ansible@一个高效的配置管理工具--Ansible configure management--翻译(八)
查看>>
【bzoj4552/Tjoi2016&Heoi2016】排序——二分+线段树/平衡树+线段树分裂与合并
查看>>
Windows Internals学习笔记(八)IO系统
查看>>
sql插件,SQLPrompt
查看>>