2022.9.9 360笔试题-老张修路
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笔试题-老张修路相关推荐
- 360笔试题-神枪手 c++
笔试题 神枪手 -c++ 题目描述 代码 题目描述 小马最近找到了一款打气球的游戏. 每一回合都会有 n个气球,每个气球都有对应的分值,第 i个气球的分值为ai. 这一回合内,会给小马两发子弹,但是由 ...
- 360笔试题(3.29)
真是被360弄醉了,这是我第一次见到这么详细又复杂的能力基础题(一堆逻辑思维,找规律的数字题,图形题,之前还有判断性格的很多题..) 除此之外,无论是能力基础还是技术题都时间不够用,有1/3的andr ...
- 奇虎360笔试题2014
一.选择题 1. 有5名同学争夺3项比赛的冠军,若每项只设1名冠军,则获得冠军的可能情况是 A120种 B130种 C60种 D125种 试题分析:题是一个分步计数问题,5名学生中任一名均可报其中的任 ...
- 360笔试题2019年4月24日(彩球分篮子问题 )
小明家有一些彩球,一段时间后小明玩耍时将它们无序的散落在家中.一天,小明想对其进行整理, 规则为一个篮子中只放一种颜色彩球,可有多个篮子放同一颜色的球,每个篮子里的球不少于2个. 假设小明整理好后,能 ...
- 奇虎360笔试题 最后一个字符
题目描述 正在挑战一个CrackMe的你,把需要填写的前面几位密码都正确猜出了,可是这最后一位密码,好像藏得有点深.CrackMe的作者还挑衅般的在里面藏了个.tar.gz文件,解压缩出来,里面写道你 ...
- 2017.08.26 360笔试题:小明卖粉笔
真的觉得很痛苦,就在考试结束后的几分钟,我终于调出来了,然而又有什么用呢? 这个代码写的特别烂,而且我只是自己调出来了通过了几个测试用例,不敢完全保证是对的.每次想这样偷懒不写循环的后果就是更加麻烦, ...
- 2022-04-16老张修路360笔试-prim构建最小生成树
prim算法构建最小生成树,返回最小权重和 using namespace std;int main() {//通用图数据存储int n, m;cin >> n;cin >> ...
- 2022春招华为笔试题-(2)
题目: 写出一个程序,接受一个由字母.数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数.(不区分大小写字母) 数据范围: 1000 \1≤n≤1000 输入描述: 第一行输入一 ...
- 2022秋招前端笔试题汇总
第一题: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. JavaScript解法: var tw ...
最新文章
- sina微博api源码阅读之函数
- Go语言int类型绑定方法
- 安装TensorFlow时出现ERROR: Cannot uninstall ‘wrapt‘问题的解决方案
- Ubuntu apt-get 源详解
- Mongodb的锁 原子性 隔离性 一致性
- C#LeetCode刷题之#141-环形链表(Linked List Cycle)
- UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 723269-723270: illegal multibyte s
- python爬虫ip代理池_爬虫教程-Python3网络爬虫开发——IP代理池的维护
- Java基础(三):常用对象
- 由三目运算符想出的PHP改进建议
- 伪静态URL、静态URL和动态URL的区别
- 广州地铁线路查询程序C语言,c语言广州地铁系统报错,帮帮忙看一看哈?
- 杭电oj刷题第一阶段答案
- python金融资产估值模型_估值方法梳理 把CFA二级书本中提及的企业估值方法在白板上全列了一遍。 一、 静心思考,绝对估值法(DCF、FCFF、FCFE、RI)... - 雪球...
- win7如何添加开机启动项
- 个人信用报告,有这五种方式可查!
- Linux 云服务器aircrack-ng后台跑包并用邮件发送结果
- java 热键_定义自己的热键
- 【SeedLab】Packet Sniffing and Spoofing Lab
- Jenkins连接svn报E170001错误的解决办法