2022.9.9 360笔试题-老张修路

给出点与边的关系及边的权值,求最小生成树的最小权值之和

测试用例:

3 3
1 1 2
2 3 3
885 513 817

样例输出:

1330

邻接矩阵 + prim

参考

#include<iostream>
#include<vector>
#include<unordered_map>
#include<unordered_set>
#include<queue>
using namespace std;int main() {//n代表结点个数,m代表边的个数int n, m;cin >> n >> m;int u, v;//入边,出边vector<vector<int>> nums(3, vector<int>(m));for (int i = 0; i < 3; i++) {for (int j = 0; j < m; j++) {cin >> nums[i][j];}}//邻接矩阵vector<vector<int>> edge(n, vector<int>(n));for (int i = 0; i < m; ++i) {edge[nums[0][i] - 1][nums[1][i] - 1] = nums[2][i];edge[nums[1][i] - 1][nums[0][i] - 1] = edge[nums[0][i] - 1][nums[1][i] - 1];}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cout << edge[i][j] << " ";}cout << endl;}unordered_map<int, int> mp;//存已经加入的边vector<int> vt;//prim开始mp[0] = 1;vt.push_back(0);int ans = 0;int minLen;int node;for (int i = 0; i < n - 1; ++i) {minLen = INT_MAX;node = -1;for (auto e1 : vt) {//for e1 in vt,离已选点最近的点加进来for (int k = 0; k < n; ++k) {if (mp[k]) continue;else if (edge[e1][k] == 0) continue;//无边else {if (edge[e1][k] < minLen) {node = k;minLen = edge[e1][k];}}}}ans += minLen;mp[node] = 1;vt.push_back(node);}cout << ans << endl;return 0;
}

邻接表 + prim

#include<iostream>
#include<vector>
#include<unordered_map>
#include<unordered_set>
#include<queue>
using namespace std;struct Edge;struct Node {int val;vector<Node*> next;vector<Edge*> edges;Node(int val) {this->val = val;}
};struct Edge {Node* from;Node* to;int weight;Edge(int w, Node* f, Node* t) {weight = w;from = f;to = t;}
};struct queue_cmp {bool operator() (Edge* a, Edge* b) {return a->weight > b->weight;}
};int main() {//n代表结点个数,m代表边的个数int n, m;cin >> n >> m;vector<vector<int>> nums(3, vector<int>(m));for (int i = 0; i < 3; i++) {for (int j = 0; j < m; j++) {cin >> nums[i][j];}}//记录点集unordered_map<int, Node*> nodes;//记录边集unordered_set<Edge*> edges;//入边,出边,权值int from, to, weight;//创建邻接表for (int i = 0; i < m; i++) {from = nums[0][i];to = nums[1][i];weight = nums[2][i];if (nodes.find(from) == nodes.end()) {Node* node = new Node(from);nodes[from] = node;}if (nodes.find(to) == nodes.end()) {Node* node = new Node(to);nodes[to] = node;}Node* nodeFrom = nodes[from];Node* nodeTo = nodes[to];//无向图,输入时创建两条相互边Edge* edge1 = new Edge(weight, nodeFrom, nodeTo);edges.insert(edge1);Edge* edge2 = new Edge(weight, nodeTo, nodeFrom);edges.insert(edge2);nodeFrom->next.push_back(nodeTo);nodeFrom->edges.push_back(edge1);nodeTo->next.push_back(nodeFrom);nodeTo->edges.push_back(edge2);}//prim算法int res = 0;unordered_set<Node*> markedNodes;priority_queue<Edge*, vector<Edge*>, queue_cmp> pQueue;//从0开始遍历点集,先将以0为入边的边都放入优先级队列中并标记for (int i = 0; i < nodes[1]->edges.size(); i++) {pQueue.push(nodes[1]->edges[i]);}markedNodes.insert(nodes[1]);while (markedNodes.size() < nodes.size()) {Edge* minEdge = pQueue.top();pQueue.pop();if (markedNodes.find(minEdge->to) == markedNodes.end()) {res += minEdge->weight;markedNodes.insert(minEdge->to);}for (int i = 0; i < minEdge->to->edges.size(); i++) {if (markedNodes.find(minEdge->to->edges[i]->to) == markedNodes.end()) {pQueue.push(minEdge->to->edges[i]);}}}cout << res << endl;return 0;
}

2022.9.9 360笔试题-老张修路相关推荐

  1. 360笔试题-神枪手 c++

    笔试题 神枪手 -c++ 题目描述 代码 题目描述 小马最近找到了一款打气球的游戏. 每一回合都会有 n个气球,每个气球都有对应的分值,第 i个气球的分值为ai. 这一回合内,会给小马两发子弹,但是由 ...

  2. 360笔试题(3.29)

    真是被360弄醉了,这是我第一次见到这么详细又复杂的能力基础题(一堆逻辑思维,找规律的数字题,图形题,之前还有判断性格的很多题..) 除此之外,无论是能力基础还是技术题都时间不够用,有1/3的andr ...

  3. 奇虎360笔试题2014

    一.选择题 1. 有5名同学争夺3项比赛的冠军,若每项只设1名冠军,则获得冠军的可能情况是 A120种 B130种 C60种 D125种 试题分析:题是一个分步计数问题,5名学生中任一名均可报其中的任 ...

  4. 360笔试题2019年4月24日(彩球分篮子问题 )

    小明家有一些彩球,一段时间后小明玩耍时将它们无序的散落在家中.一天,小明想对其进行整理, 规则为一个篮子中只放一种颜色彩球,可有多个篮子放同一颜色的球,每个篮子里的球不少于2个. 假设小明整理好后,能 ...

  5. 奇虎360笔试题 最后一个字符

    题目描述 正在挑战一个CrackMe的你,把需要填写的前面几位密码都正确猜出了,可是这最后一位密码,好像藏得有点深.CrackMe的作者还挑衅般的在里面藏了个.tar.gz文件,解压缩出来,里面写道你 ...

  6. 2017.08.26 360笔试题:小明卖粉笔

    真的觉得很痛苦,就在考试结束后的几分钟,我终于调出来了,然而又有什么用呢? 这个代码写的特别烂,而且我只是自己调出来了通过了几个测试用例,不敢完全保证是对的.每次想这样偷懒不写循环的后果就是更加麻烦, ...

  7. 2022-04-16老张修路360笔试-prim构建最小生成树

    prim算法构建最小生成树,返回最小权重和 using namespace std;int main() {//通用图数据存储int n, m;cin >> n;cin >> ...

  8. 2022春招华为笔试题-(2)

    题目: 写出一个程序,接受一个由字母.数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数.(不区分大小写字母) 数据范围: 1000 \1≤n≤1000 输入描述: 第一行输入一 ...

  9. 2022秋招前端笔试题汇总

    第一题: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标. JavaScript解法: var tw ...

最新文章

  1. sina微博api源码阅读之函数
  2. Go语言int类型绑定方法
  3. 安装TensorFlow时出现ERROR: Cannot uninstall ‘wrapt‘问题的解决方案
  4. Ubuntu apt-get 源详解
  5. Mongodb的锁 原子性 隔离性 一致性
  6. C#LeetCode刷题之#141-环形链表(Linked List Cycle)
  7. UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 723269-723270: illegal multibyte s
  8. python爬虫ip代理池_爬虫教程-Python3网络爬虫开发——IP代理池的维护
  9. Java基础(三):常用对象
  10. 由三目运算符想出的PHP改进建议
  11. 伪静态URL、静态URL和动态URL的区别
  12. 广州地铁线路查询程序C语言,c语言广州地铁系统报错,帮帮忙看一看哈?
  13. 杭电oj刷题第一阶段答案
  14. python金融资产估值模型_估值方法梳理 把CFA二级书本中提及的企业估值方法在白板上全列了一遍。 一、 静心思考,绝对估值法(DCF、FCFF、FCFE、RI)... - 雪球...
  15. win7如何添加开机启动项
  16. 个人信用报告,有这五种方式可查!
  17. Linux 云服务器aircrack-ng后台跑包并用邮件发送结果
  18. java 热键_定义自己的热键
  19. 【SeedLab】Packet Sniffing and Spoofing Lab
  20. Jenkins连接svn报E170001错误的解决办法

热门文章

  1. 阿里P8亲自讲解!成功入职头条月薪35K
  2. 企业信息化投入中咨询服务_企业信息化咨询业务分析报告.doc
  3. 机器学习之数据的偏态分布和数据的标准化
  4. 联通烽火HG680-L线刷固件 解决-卡刷-刷不上的教程
  5. 链表的基本操作(C/C++)
  6. 机器人键盘操控问题解决1
  7. 数据库入库的方式实现
  8. Oracle数据库获取uuid函数
  9. 用对仗押韵写上善若水高考作文600字
  10. 图片排版过程中,自定义子图编号设置在左上角