[召集令]-Dijkstra的单源最短路径算法

2021.3.10
题目背景
墨家家主发出召集令,所有弟子得迅速到指定地点集合。

题目描述
给定一张地图,含有n个地点(n<=10000),地点从1开始编号,地图上还含有m条单向路(m<=100000)连接着这些地点,墨家家主在1号位置,其余n-1个地点都有一个墨家弟子,通过一条路,从一个地点到另外一个地点需要花费一定的金钱, 第i条路需要花费wiw_iwiwiw_iwi<=10000)

问:所有弟子到墨家家主所在位置至少需要花费多少金钱。

输入格式
第一行,两个整数,分别是n和m,代表n个地点和m条单向路;
接下来m行,三个整数u,v,w,分别代表这一条路的起点、终点和花费的金钱。

输出格式
一个整数,代表至少需要花费的金钱。

输入输出样例
输入
5 10
1 5 3
2 1 2
2 3 7
3 2 7
3 2 8
3 4 10
4 1 10
4 5 9
5 3 10
5 1 1
输出
22
说明/提示
对于25%,n<=10, m<=100;
对于50%,n<=100, m<=1000;
对于75%,n<=1000, m<=10000;
对于100%,n<=10000,m<=100000,w_i<=10000。

时限:1.0s
内存:500MB

代码如下:

#include <iostream>
#include <cstring>
using namespace std;
const int N = 10010;
const int MAXCOST = 100100;
int vertexnum, arcnum;
int graph[N][N];int dijkstra(int graph[][N], int n, int v) {bool vis[N];int dis[N];memset(vis, 0, sizeof(vis));for (int i = 1; i <= n; i++)dis[i] = graph[v][i];vis[v] = true;for (int i = 1; i <= n - 1; i++) {int minx = MAXCOST;int minid = 0;for (int j = 1; j <= n; j++) {if (vis[j] == 0 && dis[j] < minx) {minx = dis[j];minid = j;}}vis[minid] = true;for (int k = 1; k <= n; k++) {if (graph[minid][k] < MAXCOST)if (dis[k] > dis[minid] + graph[minid][k]) {dis[k] = dis[minid] + graph[minid][k];}}}return dis[1];
}int main() {cin >> vertexnum >> arcnum;for (int i = 1; i <= vertexnum; i++)for (int j = 1; j <= vertexnum; j++)if (i == j)graph[i][j] = 0;elsegraph[i][j] = MAXCOST;for (int i = 1; i <= arcnum; i++) {int a, b, w;cin >> a >> b >> w;if (graph[a][b] > w)graph[a][b] = w;}int sum = 0;for (int i = 2; i <= vertexnum; i++) {int c =  dijkstra(graph, vertexnum, i);sum += c;}cout << sum << endl;return 0;
}

本人水平有限,采用了邻接矩阵的Dijkstra算法,只能拿50分…,还望有大神能给予帮助。
在这里插入图片描述

哈哈哈哈哈,突然想到了怎么解了,发现自己太笨了,这题求的是所有其他点(墨家弟子)到起点(墨家家主)的距离之和,我居然用dijkstra求每一个点到起点的位置,但是其实,我们只要将题意转换,变成墨家家主到其他所有点的距离之和,就变成了用一次dijkstra算法就行了,只要输入的时候,原本方向是a到b的,我们就改成b到a,最后用一次dijkstra算法就行了。

AC代码如下:

#include <iostream>
#include <cstring>
using namespace std;
const int N = 10010;
const int MAXCOST = 100100;
int vertexnum, arcnum;
int graph[N][N];
bool vis[N];
int dijkstra(int graph[][N], int n, int v) {int dis[N];for (int i = 1; i <= n; i++)dis[i] = graph[v][i];vis[v] = true;for (int i = 1; i <= n - 1; i++) {int minx = MAXCOST;int minid = 0;for (int j = 1; j <= n; j++) {if (vis[j] == 0 && dis[j] < minx) {minx = dis[j];minid = j;}}vis[minid] = true;for (int k = 1; k <= n; k++) {if (graph[minid][k] < MAXCOST)if (dis[k] > dis[minid] + graph[minid][k]) {dis[k] = dis[minid] + graph[minid][k];}}}int sum = 0;for (int i = 1; i <= n; i++) {sum += dis[i];}return sum;
}int main() {cin >> vertexnum >> arcnum;for (int i = 1; i <= vertexnum; i++)for (int j = 1; j <= vertexnum; j++)if (i == j)graph[i][j] = 0;elsegraph[i][j] = MAXCOST;for (int i = 1; i <= arcnum; i++) {int a, b, w;cin >> a >> b >> w;if (graph[b][a] > w)graph[b][a] = w;}int sum = 0;cout << dijkstra(graph, vertexnum, 1);return 0;
}

2021.3.25更新
好像才隔了15天。
学会了邻接表实现的dijkstra算法,然后再来ac一下这题!!!

代码如下:

#include <iostream>
#include <vector>
#include <queue>
#include <string>
using namespace std;
const int N = 10010;
bool done[N];
int dis[N];
const int INF = 1 << 30;
int n, m;struct edge {int from;int to;int w;
};struct node {int id;int dis;friend bool operator<(const node &a, const node &b) {return a.dis > b.dis;}
};vector<edge>e[N];void dijkstra() {priority_queue<node>q;int s = 1;memset(done, 0, sizeof(done));for (int i = 1; i <= n; i++)dis[i] = INF;dis[s] = 0;q.push({s, dis[s]});while (q.size()) {node t = q.top();q.pop();if (done[t.id])continue;for (int i = 0; i < e[t.id].size(); i++) {edge y = e[t.id][i];if (done[y.to])continue;if (dis[y.to] > y.w + t.dis) {dis[y.to] = y.w + t.dis;q.push({y.to, dis[y.to]});}}}int ans = 0;for (int i = 1; i <= n; i++) {ans += dis[i];}cout << ans << endl;
}int main() {cin >> n >> m;while (m--) {int a, b, c;cin >> a >> b >> c;e[b].push_back({b, a, c});}dijkstra();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word List 43

word List 43 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

小微技术团队的DevOps体系折腾之路(顺带发布52ABP新版本)

加个“星标★”&#xff0c;好文必达&#xff01;本想纯粹说下52ABP新版本发布&#xff0c;但是写着写着,过去的时间更多折腾的是DevOps体系的建设。这篇同样适用于小公司或者个人开发者脱离人肉运维的方法。说下52ABP&#xff0c;我们发布了新版本&#xff0c;版本号3.1.0&…

word List44

word List44 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

python序列数据类型_Python 数据类型 之 序列类型

序列&#xff1a;表示索引为非负整数的有序对象集合&#xff0c;所有序列都支持迭代 序列类型有&#xff1a;字符串&#xff0c;列表&#xff0c;元组 三种 字符串也是一种序列 列表和元组是任意python对象的序列或叫有序集合 字符串和元组不可变序列&#xff0c;列表支持插入、…

word List 45

word List 45 One of the pressing problems our nation faces today is how to strike a balance between economic development and environmental protection. 我们国家当今面临的最紧迫的问题之一就是如何平衡经济发展和环境保护之间的关系。 Corruption has existed since…

2020 年 中国.NET开发者调查报告

微信公众号dotnet跨平台2020年初做的一个关于中国.NET开发者调查收到了开发者近 1400 条回复。这份调查报告涵盖了开发者工具链的所有部分&#xff0c;包括编程语言、应用架构、应用服务器、运行时平台、框架技术、框架配置、IDE、.NET/.NET Core 发行版部署模式、构建工具和Ku…

列名无效如何解决_XSKY ClickHouse如何实现存算分离

在介绍ClickHouse之前&#xff0c;说一下OLAP。OLAP也叫联机分析处理(Online Analytical Processing)。OLAP系统以维度模型来存储历史数据&#xff0c;其主要存储描述性的数据并且在结构上都是同质的。01ClickHouseOLAP应用有如下特点&#xff1a;1、大多数的请求是读请求&…

word List 46

word List 46 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

.NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(下)

06 | 作用域与对象释放行为接下来&#xff0c;把服务切换为单例模式&#xff0c;通过工厂的方式services.AddSingleton<IOrderService>(p > new DisposableOrderService());启动程序&#xff0c;输出如下&#xff1a;1 2 接口请求处理结束可以看到代码实际上不会被释放…

C++实现邻接表存储的图及bfs遍历

#include <iostream> #include <queue> using namespace std; typedef char VerTexType; #define MVNum 100 typedef char OtherInfo; bool vis[MVNum];//邻接表 typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;OtherInfo info; } ArcNode;//弧(边)t…

cmd小游戏_使用pygame制作Flappy bird小游戏

原文链接&#xff1a;【Python】使用Pygame做一个Flappy bird小游戏&#xff08;一&#xff09;​mp.weixin.qq.com最近看到很多大佬用强化学习玩Flappy bird。所以打算也上手玩一玩&#xff0c;但是苦于没找到pc上的这个游戏&#xff0c;找了点资料&#xff0c;发现并不是很难…

word List 47

word List 47 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

使用BeetleX构建基础的SSL网络通讯

BeetleX的使用非常简单&#xff0c;通过Stream的数据流模式可以让你轻松处理网络数据&#xff1b;在处理SSL加密通讯的时候组件的使用也是非常方便&#xff0c;只需要简单的配置证书即可完成基于SSL的网络安全通讯&#xff0c;接下来介绍一下通过组件快速构建一个安全可靠的网络…

调用其他app 的lib_ButterKnife执行效率为什么比其他注入框架高?它的原理是什么...

面试官: ButterKnife为什么执行效率为什么比其他注入框架高&#xff1f;它的原理是什么心理分析&#xff1a; ButterKnife框架一直都是使用&#xff0c;很少又开发者对butterknife深入研究的&#xff0c;既然你是面试Android高级岗位&#xff0c;自然需要有相应被问到原理的准备…

算法---会议最大安排问题

算法—会议最大合理安排问题 参考&#xff1a;趣学算法 代码&#xff1a; #include <stdio.h> #include <stdlib.h> typedef struct meet {int beg;//开始int end;//结束int num;//会议编号 }meet; int cmp44(meet m1,meet m2) {//越早结束的越优先&#xff0c;…

小cookie,大智慧

Cookie是什么&#xff1f;cookies是你访问网站时创建的数据片段文件&#xff0c;通过保存浏览信息&#xff0c;它们使你的在线体验更加轻松。使用cookies&#xff0c;可以使你保持在线登录状态&#xff0c;记录你的站点偏好&#xff0c;并为你提供本地化支持。First-party cook…

java 最少使用(lru)置换算法_LRU算法详解及最简单的Java实现

更多内容&#xff0c;欢迎关注微信公众号&#xff1a;全菜工程师小辉~LRU(Least recently used&#xff0c;最近最少使用)算法根据数据的历史访问记录来进行淘汰数据&#xff0c;其核心思想是“如果数据最近被访问过&#xff0c;那么将来被访问的几率也更高”。LRU算法的表现新…

word List 48

word List 48 如果存在什么问题&#xff0c;欢迎批评指正!谢谢&#xff01;

一文读懂常用开源许可证

社区时常为流行产品中有争议的开源许可证而感到震惊&#xff0c;这引起各方关注&#xff0c;纷纷争论何为真正的开源许可证。去年&#xff0c;Apache 基金会&#xff08;Apache Foundation&#xff09;禁止使用 Facebook React 那些具有争议的专利组件&#xff0c;这引发了轩然…

[蓝桥杯2015初赛]手链样式-思维+next_permutation枚举(好题)

题目描述 小明有3颗红珊瑚&#xff0c;4颗白珊瑚&#xff0c;5颗黄玛瑙。 他想用它们串成一圈作为手链&#xff0c;送给女朋友。 现在小明想知道&#xff1a;如果考虑手链可以随意转动或翻转&#xff0c;一共有多少不同的组合样式&#xff1f; 输出 请你输出该整数。不要输出任…