7-7 超级玛丽 (10 分)

假定有n个城堡,编号为1至n,有的城堡之间有道路直接相连,有的城堡之间没有道路直接相连。马里奥现在准备从一个城堡出发前往另一个城堡,它有一个魔法棒,可以瞬时通过一条道路,即以0时间通过这条道路,但魔法棒最多只能用一次。马里奥想以最短的时间到达目的地,请编写程序为马里奥选定一条路线以及在什么地方使用魔法棒。假定所有道路为双向,保证从起点肯定能到达目的地。

在这里插入图片描述
输入格式:
输入第一行为4个整数n、s、t、m,分别表示城堡数(编号为1至n,n不超过10000),马里奥所在的起点s和想去的终点t,城堡间的道路数目。接下来m行,每行为3个正整数a、b、c,表示城堡a和城堡b之间有一条道路直接相连,通过该道路需要c分钟。

输出格式:
输出为空格间隔的2个整数,第1个整数为马里奥从起点到目的地所需的最短时间;第2个整数表示使用魔法棒的地点,即城堡编号,若有多个可能的地点,则输出编号最小者。

输入样例:

4 1 4 4
1 2 9
2 4 1
1 3 3
3 4 5

输出样例:

1 1

被最后两个测试点的数据范围卡了半天,闹心。非独立完成,有请教他人
AC代码1:求一次s的最短路和t的最短路,然后枚举边,如果这条边的两个端点分别能到s和t,说明有一条路经过这条边能从s到t,那么这条路的最小值就是s到这条边一个端点的最短路+t到另一个端点的最短路。这个邻接表和初始化有必要记一记,因为我很少这么写,只是见过
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;typedef struct {int u, v; //每条边的起点和终点
} Edge;typedef long long ll;
const ll inf = 1e12;
const int N = 1e4 + 10, M = 1e8 + 10;//分别为顶点数和边数
bool vis[N] = {false};
ll diss[N], dist[N]; //diss表示起点s到其他各点的距离,dist表示终点t到其他各点的距离//h表示从某顶点出发的第一条边的编号,e为该条边的终点编号,//w为该条边的权值,ne存储从该顶出发的下一条边的编号,idx为第几条边
int h[N], e[M], w[M], ne[M], idx;
int n, m, s, t; //顶点数 边数 起点 终点
Edge edge[M]; //存储每一条边的信息void add(int a, int b, int c) { //邻接表(头插法)存储边信息e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}void spfa(ll dis[], int u) { //最短路算法spfafor (int i = 1; i <= n; i++) {dis[i] = inf;vis[i] = false;}queue<int> qe;qe.push(u);dis[u] = 0;vis[u] = true;while (!qe.empty()) {int x = qe.front();qe.pop();vis[x] = false;for (int i = h[x]; i != -1; i = ne[i]) {int j = e[i];if (dis[j] > dis[x] + w[i]) {dis[j] = dis[x] + w[i];if (!vis[j]) {qe.push(j);vis[j] = 1;}}}}
}int main() {scanf("%d %d %d %d", &n, &s, &t, &m);memset(h, -1, sizeof(h)); //初始时,每个顶点的第一条边的编号都设为-1,表示没有边for (int i = 0; i < m; i++) { //输入每条边的信息int a, b, c;scanf("%d %d %d", &a, &b, &c);add(a, b, c), add(b, a, c); //双向存储边信息edge[2 * i].u = a, edge[2 * i].v = b;//正向存储每条边的起点和终点edge[2 * i + 1].u = b, edge[2 * i + 1].v = a;//反向存储每条边的起点和终点}spfa(diss, s);//从起点s出发的单源最短路spfa(dist, t);//从终点t出发的单源最短路ll minx = inf;int pos;for (int i = 0; i < 2 * m; i++) {int a = edge[i].u, b = edge[i].v;if (diss[a] + dist[b] < minx) { //寻找最小值minx = diss[a] + dist[b];pos = a;} else if (diss[a] + dist[b] == minx && a < pos) { //最小值相同时,寻找最小编号pos = a;}}printf("%lld %d", minx, pos);return 0;
}
代码1C语言版本
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct {int u, v; //每条边的起点和终点
} Edge;typedef long long ll;
const ll inf = 1e12;
//M的大小不能为1e8及以上,我的不行,提示内存超限!!!!
const int N = 1e4 + 10, M = 1e7 + 1000; //分别为顶点数和边数
int q[N];
int vis[N] = {0};
ll diss[N],dist[N]; // diss表示起点s到其他各点的距离,dist表示终点t到其他各点的距离// h表示从某顶点出发的第一条边的编号,e为该条边的终点编号,// w为该条边的权值,ne存储从该顶出发的下一条边的编号,idx为第几条边
int h[N], e[M], w[M], ne[M], idx;
int n, m, s, t; //顶点数 边数 起点 终点
Edge edge[M];   //存储每一条边的信息void add(int a, int b, int c) { //邻接表(头插法)存储边信息e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}void spfa(ll dis[], int u) { //最短路算法spfafor (int i = 1; i <= n; i++) {dis[i] = inf;vis[i] = 0;}int head = 0, rear = 0;q[rear++] = u;dis[u] = 0;vis[u] = 1;while (head != rear) {int x = q[head++];vis[x] = 0;for (int i = h[x]; i != -1; i = ne[i]) {int j = e[i];if (dis[j] > dis[x] + w[i]) {dis[j] = dis[x] + w[i];if (!vis[j]) {q[rear++] = j;vis[j] = 1;}}}}
}int main() {scanf("%d %d %d %d", &n, &s, &t, &m);memset(h, -1,sizeof(h)); //初始时,每个顶点的第一条边的编号都设为-1,表示没有边for (int i = 0; i < m; i++) { //输入每条边的信息int a, b, c;scanf("%d %d %d", &a, &b, &c);add(a, b, c), add(b, a, c);           //双向存储边信息edge[2 * i].u = a, edge[2 * i].v = b; //正向存储每条边的起点和终点edge[2 * i + 1].u = b, edge[2 * i + 1].v = a; //反向存储每条边的起点和终点}spfa(diss, s); //从起点s出发的单源最短路spfa(dist, t); //从终点t出发的单源最短路ll minx = inf;int pos;for (int i = 0; i < 2 * m; i++) {int a = edge[i].u, b = edge[i].v;if (diss[a] + dist[b] < minx) { //寻找最小值minx = diss[a] + dist[b];pos = a;} else if (diss[a] + dist[b] == minx && a < pos) { //最小值相同时,寻找最小编号pos = a;}}printf("%lld %d", minx, pos);return 0;
}
AC代码2:分层图,emmm,现在还很懵逼,建完后,总共两个图,使用一次最短路算法,不是我写的代码。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int path[N], h[N], e[N], w[N], ne[N], idx, d[N], q[N], n;
bool st[N];
void add(int a, int b, int c) {e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void spfa(int s) {memset(d, 0x3f, sizeof d);int hh = 0, tt = 0;q[tt++] = s;d[s] = 0;st[s] = 1;while (hh != tt) {int t = q[hh++];st[t] = 0;for (int i = h[t]; ~i; i = ne[i]) {int j = e[i];if (d[j] > d[t] + w[i]) {d[j] = d[t] + w[i];path[j] = t;if (!st[j]) {q[tt++] = j;st[j] = 1;}} else if (n <= 10 && d[j] == d[t] + w[i] && path[j] > t)path[j] = t;}}
}
int main() {memset(h, -1, sizeof h);int s, t, m;scanf("%d%d%d%d", &n, &s, &t, &m);while (m--) {int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c), add(b, a, c), add(a, b + n, 0), add(b, a + n, 0),add(a + n, b + n, c), add(b + n, a + n, c);}spfa(s);int x = t + n;while (x > n)x = path[x];printf("%d %d", d[t + n], x);return 0;
}

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

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

相关文章

Keras利用卷积神经网络玛丽莲梦露与爱因斯坦的识别Part1

目的 突发奇想想会认为下面这张图片究竟是玛丽莲梦露还是爱因斯坦&#xff0c;主要目的顺便实践练习《Python深度学习》书中的例子&#xff0c;只采用了很小批量的数据&#xff0c;也没有深究如何提高正确率&#xff0c;解决过拟合的问题。详细可以参见《python深度学习》第五章…

玛丽莲·梦露从未公开的照片

世界著名的摄影师伊夫 阿诺德最近将几张玛丽莲梦露从未公开的照片限量分发给了英国几个选定的画廊。 已经94岁高龄的阿诺德当年与梦露建立了互相信任的关系&#xff0c;拍了许多反映梦露私秘生活的照片&#xff0c;但她很少将这些照片公之于众&#xff0c;借助曝露名人的隐私来…

定制化需求|一个人工智能大模型应用的算力成本有多高?

“ 人工智能的核心是算力。” 01 — 需要多少预算&#xff1f; 最近在学习大模型ChatGPT、ChatGLM&#xff0c;研究结合企业的应用场景&#xff0c;解决一些业务难点、痛点&#xff0c;不免涉及本地化部署、微调、训练、知识库文档数据提取等等方面的问题。‍‍‍‍ 同时还需要…

一键在线生成朋友圈转发点赞截图教程

1.我们首先打开朋友圈转发截图生成工具网站&#xff1a;https://oss.361s.cn/tool/pyq/ 2.输入自己的微信昵称&#xff0c;上传头像&#xff0c;撰写文本等等&#xff0c;自定义设置完成之后点击生成即可获得你想要的朋友圈截图。 3.点击保存即可完成全部流程。 本文转载自…

朋友圈转发截图生成工具HTML源码

正文: 朋友圈转发截图生成工具HTML源码&#xff0c;微信朋友圈截图模拟器源码&#xff0c;微信朋友圈装逼生成器大全&#xff0c;上传服务器即可使用&#xff0c;装逼必备&#xff0c;有条件的可以打包成AP。 下载方式: lanzou.com/iXBIb033ddgj

朋友圈转发截图生成工具源码

微信朋友圈截图模拟器源码&#xff0c;微信朋友圈装逼生成器大全&#xff0c;上传服务器即可使用&#xff01;装逼必备&#xff01;有条件的可以打包成APP 图片&#xff1a; 学习资料地址&#xff1a;朋友圈转发截图生成工具源码.zip - 蓝奏云

用itchat爬取朋友圈好友信息

用itchat爬取微信好友基本信息 Python有一个好玩的软件包itchat&#xff0c;提供了一个微信api接口&#xff0c;借此可以爬取朋友圈的一些基本信息&#xff0c;下面我们一起来玩玩吧。 import itchat import numpy as np import pandas as pd from collections import defaul…

微信转发指定的图文消息到朋友圈(JAVA版)

微信转发图文消息步骤 微信转发图文消息步骤 需求获取凭证 获取aceess_token获取jsapi_ticket缓存获取的jsapi_ticket代码 config接口注入权限 引入js文件微信权限注入接口 JS-SDK分享接口调用总结温馨提示 需求 当用户购买成功一样产品&#xff0c;为了使用户能够二次消费&a…

生成朋友圈转发点赞截图的小工具

当当当当&#xff01;开工大吉&#xff01; 新春虎年的第一个工作日&#xff0c;相信有不少的小伙伴跟TJ君一样&#xff0c;斗志满满的开始了新一年的工作之旅。 也肯定有不少的小伙伴还在休假&#xff0c;享受一年难得的相聚。 那么春节期间&#xff0c;大家都去了什么好玩的地…

微信截图不能截微信界面

有时候&#xff0c;大家用电脑微信快捷键 Alt A 时&#xff0c;不能截取 微信窗口 界面。 大家可能很迷茫&#xff0c;不要慌&#xff0c;so easy,一招搞定 1&#xff1a;点击微信聊天界面 小剪刀 2&#xff1a; 取消 截图时隐藏当前窗口 大功告成。

kafka消费指定每次最大消费消息数量 max.poll.records

一个属于new consumer的配置项&#xff0c;出现在0.10及其以上版本中。 #一次调用poll()操作时返回的最大记录数&#xff0c;默认值为500 spring.kafka.consumer.max-poll-records; Properties properties new Properties();properties.put("max.poll.records",2);…

Kafka 消费者读取数据

更多内容&#xff0c;前往 IT-BLOG 消费者不需要自行管理 offset&#xff08;分组topic分区&#xff09;&#xff0c;系统通过 broker 将 offset 存放在本地。低版本通过 zk 自行管理。系统自行管理分区和副本情况。消费者断线后会自动根据上一次记录的 offset 去获取数据&…

Kafka消费异常处理

异常 org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time between subsequent calls to poll() was longer than the …

账户系统,余额与体现

参考连接: https://blog.pingxx.com/2018/02/27/用户账户系统该怎么用?/ 账户体系的建立实际上是将结清算分开(即实时清算/定时结算)利于更复杂的支付业务(如分账/层级分润等): 建立账户体系时要根据业务需求考虑各种账户(如余额账户/冻结资金账户/红包账户(不能提现但是能…

微信支付成功,如何刷新用户当前页面的余额

本项目中&#xff0c;使用微信支付&#xff0c;支付成功后&#xff0c;弹出提示框&#xff0c;并且目的是改变当前用户的余额。。。我们在互动直播项目中发现 &#xff0c;然而事情并没有那么简单。 代码如下&#xff1a; 我们知道&#xff0c;应该在appdelegate中调用微信支…

开源趣事~ 记给 OpenHarmony 提 PR 的那些事

大家好哇&#xff0c;许久不见&#xff0c;也感谢大家这么久一直以来的关注&#xff0c;也感谢在短视频盛行的今天&#xff0c;你们还能静下心来坚守文字的阵地。 说到这次的主题&#xff0c;参加鸿蒙项目的开源&#xff0c;也是小编第一次拥抱开源&#xff0c;就像是别人有困…

基于大规模边缘计算的千万级聊天室技术实践

在技术的迭代更新下&#xff0c;面对大型、超大型的直播场景&#xff0c;大规模边缘聊天室成为新热潮。 作者 | 张超 责编 | 王子彧 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 当前直播成为一种流行趋势&#xff0c;带货直播&#xff0c;网红带货&#…

JavaScript成功背后的四个关键人物!

前言&#xff1a;JavaScript能如此成功&#xff0c;至少有四位关键人物&#xff1a; 1. JavaScript作者Brendan Eich 2. JSLint&#xff0c;JSON作者Douglas Crockford 3. jQuery作者John Resig 4. Node.js作者Ryan Dahl。 Brendan Eich以及JavaScript的发明过程大家已经非常熟…

爬虫教程( 3 ) --- 手机 APP 数据抓取

1. Fiddler 设置 这是使用 fiddler 进行手机 app 的抓包&#xff0c;也可以使用 Charles&#xff0c;burpSuite 等。。。 电脑安装 Fiddler&#xff0c;手机 和 安装 fiddler 的电脑处于同一个网络里&#xff0c; 否则手机不能把 HTTP 发送到 Fiddler 的机器上来。 配置 Fiddle…

以某乎为实战案例,教你用Python爬取手机App数据

1 前言 最近爬取的数据都是网页端&#xff0c;今天来教大家如何爬取手机端app数据&#xff08;本文以ios苹果手机为例&#xff0c;其实安卓跟ios差不多&#xff09;&#xff01; 本文将以『某乎』为实战案例&#xff0c;手把手教你从配置到代码一步一步的爬取App数据&#xff0…