博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客练习赛41 C 抓捕盗窃犯
阅读量:3905 次
发布时间:2019-05-23

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

题目链接:

思路:

求连通块,因为一个连通块上的顶点在经过无数次传递之后肯定能经过同一个点,所以就求出连通块的数目,然后计算,然后累加前m大的即可。

代码如下:
 

#include 
#include
#include
#include
using namespace std;typedef long long ll;const int maxn=1e5+5;int n,m;int a[maxn];int b[maxn];int c[maxn];ll num[maxn];int ci;int Find (int x){ if(a[x]==x) return x; return a[x]=Find(a[x]);}int main(){ memset (num,0,sizeof(num)); scanf("%d%d",&n,&m); ci=n; for (int i=1;i<=n;i++) a[i]=i; for (int i=1;i<=n;i++) { scanf("%d",&b[i]); } for (int i=1;i<=n;i++) { scanf("%d",&c[i]); int pa=Find(i); int pb=Find(c[i]); if(pa!=pb) { a[pa]=pb; ci--; } } ll ans=0; for (int i=1;i<=n;i++) { num[Find(i)]+=b[i]; } sort(num+1,num+n+1); for (int i=0;i

 

转载地址:http://uwoen.baihongyu.com/

你可能感兴趣的文章
卡尔曼滤波 -- 从推导到应用(一)
查看>>
卡尔曼滤波 -- 从推导到应用(二)
查看>>
卡尔曼滤波的原理说明
查看>>
先验概率与后验概率及贝叶斯公式
查看>>
ROS下订阅/cmd_vel节点
查看>>
The illustrated guide to a Ph.D.
查看>>
Ubuntu 14.04.1 for ROS(indigo) by ExBot iso 发行版
查看>>
OpenCV的Mat与ATL/MFC的CImage相互转换
查看>>
OpenCV学习笔记(一):读取、显示、保存图片
查看>>
一个代替Mathtype的公式编辑器软件——axmath
查看>>
TLD视觉跟踪算法
查看>>
Altium Designer PCB 常用功能键
查看>>
机器人工程师学习计划
查看>>
实现图像的局部放大
查看>>
eclipse运行时弹出提示java was started but returned exit code=13
查看>>
MATLAB鼠标选取ROC区域
查看>>
MFC按键控制
查看>>
google play app下载方法测试
查看>>
STM32利用FATFS读写数组
查看>>
Altium_Designer如何快速寻找元件和封装
查看>>