第六章 图论 8 AcWing 1624. 地铁地图

news2025/7/10 23:58:59

第六章 图论 8 AcWing 1624. 地铁地图

原题链接

AcWing 1624. 地铁地图

算法标签

图论 单源最短路 dijkstra spfa

思路

若采用邻接矩阵存储
在这里插入图片描述
超出本题空间限制,因此无法采用邻接矩阵存储,可采用邻接表存储
若采用常规建图方式(即相邻两点之间建一条边)
在这里插入图片描述
采用另一种建图方式 若两点可达 建立双向边
在这里插入图片描述
最多需要建立边数
在这里插入图片描述
对于最短路问题 通常可存储的边数与点数
在这里插入图片描述
在这里插入图片描述
若采用常规dijkstra,算法时间复杂度O(n*m),由于时间限制:0.4s,将会超时
在这里插入图片描述
因此采用堆优化版dijkstra(常规dijkstra瓶颈在于寻找最小值的点,堆优化版dijkstra将所有未寻找放置堆中,堆中寻找最小值时间复杂度为O(log(1),更新最小值时间复杂度为O(log(n)),算法时间复杂度O(m*log(n)),由于时间限制:0.4s,可通过

由于可能会存在回路,对于回路,路径长度

在这里插入图片描述

代码

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define ump unordered_map
#define pq priority_queue
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>=b;--i)
using namespace std;
typedef pair<int, int> PII;
const int N = 10005;
//int t, n, m, cnt, ans;
string info[N];
int h[N], ne[N*100], e[N*100], w[N*100], line[N*100], stop[N], dist[N], cnt[N], pre[N], idx;
bool st[N];
int n, m;
inline int rd(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>=10) put(x/10);
    putchar(x%10^48);
} 
string format(int x){
    char res[5];
    sprintf(res, "%04lld", x);
    return res;
}
void add(int a, int b, int c, int id){
    e[idx]=b, w[idx]=c, line[idx]=id, ne[idx]=h[a], h[a]=idx++;
}
void dij(int S, int T){
    memset(dist, 0x3f, sizeof dist);
    memset(cnt, 0x3f, sizeof cnt);
    memset(st, 0, sizeof st);
    pq<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, S});
    dist[S]=cnt[S]=0;
    while(heap.size()){
        auto t=heap.top();
        heap.pop();
        int val=t.y;
        if(val==T){
            break;
        }
        if(st[val]){
            continue;
        }
        st[val]=true;
        for(int i=h[val]; ~i; i=ne[i]){
            int j=e[i];
            if(dist[j]>dist[val]+w[i]){
                dist[j]=dist[val]+w[i];
                cnt[j]=cnt[val]+1;
                pre[j]=val;
                info[j]="Take Line#"+to_string(line[i])+" from "+format(val)+" to "+format(j)+ ".";
                heap.push({dist[j], j});
            }else if(dist[j]==dist[val]+w[i]){
                if(cnt[j]>cnt[val]+1){
                    cnt[j]=cnt[val]+1;
                    pre[j]=val;
                    info[j]="Take Line#"+to_string(line[i])+" from "+format(val)+" to "+format(j)+ ".";
                
                }
            }
        }
    }
    vector<string> path;
    cout<<dist[T]<<"\n";
    for(int i=T; i!=S; i=pre[i]){
        path.push_back(info[i]);
    }
    Rep(i, path.size()-1, 0){
        cout<<path[i]<<"\n";
    }
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
// 	n=rd();
    cin>>n;
    memset(h, -1, sizeof h);
	rep(i, 1, n+1){
	   // m=rd();
	    cin>>m;
	    rep(j, 0, m){
	       // stop[i]=rd();
	       cin>>stop[j];
	    }
	    rep(j, 0, m){
	        rep(k, 0, j){
	            int len;
	            // 非环路 长度j-k
	            if(stop[0]!=stop[m-1]){
	                len=j-k;
	            }else{ // 环路 长度为j-k,m-1-j+k最小值
	                len=min(j-k, m-1-j+k);
	            }
	            add(stop[j], stop[k], len, i);
	            add(stop[k], stop[j], len, i);
	        }    
	    }
	}
// 	int k=rd();
    int k;
    cin>>k;
	while(k--){
	   // int S=rd(), T=rd();
	    int S, T;
	    cin>>S>>T;
	    dij(S, T);
	}
	return 0;
}

参考文献

AcWing 1624. 地铁地图(PAT甲级辅导课)y总视频讲解

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

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

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

相关文章

微信小程序|基于小程序实现人脸融合

文章目录一、文章前言二、具体流程及准备三、开发步骤四、完整代码一、文章前言 此文主要通过小程序实现人脸图像融合&#xff0c;将检测到的两张人脸进行融合&#xff0c;输出一张融合后的人脸。 二、具体流程及准备 2.1、注册百度开放平台及微信公众平台账号。 2.2、下载及安…

概论_第2章随机变量及其概率分布__离散型随机变量之二项分布

二项分布是离散型随机变量的内容 一. 定义&#xff1a; 若随机变量X的可能取值为0, 1, ... ,n, 而X的分布值为 , k0,1,…n 其中&#xff0c;0<p<1, q 1-p, 称X服从参数为n, p的二项分布&#xff0c; 简记为 X ~ B(n, p) 1. 当n1时&#xff0c; X服从0-1分布, …

想进入游戏建模行业,这4点必须了解

“游戏行业不关心你的专业&#xff0c;只关心你的作品”&#xff0c;想要进入游戏行业就记住这句话&#x1f44d; 这一年可是越来越多人想要进入游戏行业啦&#xff5e;造成了汤多肉少的情况&#xff0c;咱们怎样才能在一群竞争者中脱颖而出呢❓有4⃣大点你要注意的&#xff1…

决策树算法在计算机视觉中的应用附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

利用SpringBoot和vue+elementui做一个简单的书本信息管理系统

目录 1.准备工作 1.1.数据库准备 1.2.前端准备工作 1.3.后端准备工作 2.后台代码的编写 2.1.修改配置文件 2.2. 编写service层 2.3.编写Controller层 3.前台代码的编写 3.1.在src里面的api里面的action.js 3.2.搜索栏&#xff0c;表单 3.3.表格 3.4.弹出新增的模态…

[附源码]SSM计算机毕业设计整形美容咨询网站JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【考研复试】计算机专业考研复试英语常见问题二(研究方向/前沿技术/本科毕设篇)

相关链接&#xff1a; 【考研复试】计算机专业考研复试英语常见问题一&#xff08;家庭/家乡/学校篇&#xff09;【考研复试】计算机专业考研复试英语常见问题二&#xff08;研究方向/前沿技术/本科毕设篇&#xff09;【考研复试】计算机专业考研复试英语常见问题三&#xff0…

助老服务机器人结构设计

目 录 摘要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 国外助老服务机器人的研究 1 1.2.1 爱尔兰PAM-AID 助老服务机器人 1 1.2.2 美国SmartCane 助老服务机器人 2 1.2.3 韩国WAR 助老服务机器人 3 1.2.4 日本助老服务机器人 4 1.2.5 可穿戴的外骨骼式助老服务机器人 4 …

(九)Spring之Bean的循环依赖问题

文章目录环境什么是Bean的循环依赖singleton下的set注入产生的循环依赖prototype下的set注入产生的循环依赖构造注入产生的循环依赖singleton下的构造注入prototype下的构造注入Spring解决循环依赖的机理&#xff08;底层实现&#xff09;上一篇&#xff1a;&#xff08;八&…

注释写的好,文档不潦草.

大家好&#xff0c;long time no see&#xff01;这次聊一聊「注释」。写「注释」的好处众所周知&#xff0c;但有时在实现一些「公共代码」后&#xff0c;需要编写「文档」&#xff0c;其中「注释」和「文档」的内容是大致相同的&#xff0c;比如param和returns等(相信有不少同…

Java_抽象类和接口(一)

作者&#xff1a;爱塔居的博客_CSDN博客-JavaSE领域博主 专栏&#xff1a;JavaSE 作者简介&#xff1a;大三学生&#xff0c;希望跟大家一起进步&#xff01; 文章目录 目录 文章目录 一、抽象类 1.1 抽象类概念 1.2 抽象类语句 1.3 抽象类特性 1.4 抽象类和普通类的区别 1.5 抽…

赞不绝口!仅靠阿里P9分享的 Redis 工作手册,拿到60W年薪Offer

昨晚有六七位小伙伴告诉我说&#xff1a;“大佬&#xff0c;有没有Redis的面试教程啊&#xff0c;最近面试被问到好多” 这就帮小伙伴们专门整理了一份资料&#xff08;不仅仅是面试题&#xff09;&#xff0c;从Redis核心原理到Redis设计与源码帮助大家梳理体系&#xff0c;快…

教你自己写Arcpy批处理程序

自己写Arcpy批处理栅格和矢量 先上代码&#xff0c;讲解各行代码的意思&#xff0c;从而达到自己写代码的目的 #....Edit by Longhao Wang.... import arcpy from arcpy import env from arcpy.sa import * import os import os.path import sys arcpy.env.workspace"D:…

Vue项目开发经验

文章目录前言网页组件echarts使用打包后显示包体积安装tensorflow和anaconda可能出现的错误![在这里插入图片描述](https://img-blog.csdnimg.cn/c1facd95a7f645c5af3e8dc1237913a3.png)总结前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联系后即刻更改 科普&…

《调试九法》阅读笔记

1. 理解系统 阅读手册、仔细阅读每个细节、掌握基础知识、了解工作流程、了解工具。 2. 制造失败 制造失败、从头开始、引发失败、但不要模拟失败、查找不受你控制的条件、记录每件事情&#xff0c;并找到间歇性bug特征、不要过于相信统计数据、要认识到“那”是可能会发生的…

[附源码]java毕业设计商场日常维修管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【云原生】k8s 中的 hostNetwork 和 NetworkPolicy(网络策略)讲解与实战操作

文章目录一、hostNetwork 介绍二、k8s 网络策略 NetworkPolicy三、Pod 隔离的两种类型四、NetworkPolicy 资源1&#xff09;NetworkPolicy 示例演示2&#xff09;选择器 to 和 from 的行为五、总结一、hostNetwork 介绍 在k8s中&#xff0c;若pod使用主机网络&#xff0c;也就是…

UE5笔记【四】UE5主材质Master Materials和材质实例MI

上一篇我们讲解了关于鹅卵石的纹理材质。 假设&#xff1a;如果我们在关卡中每个材质都这么连接的话&#xff0c;那么将使得整个世界非常复杂&#xff0c;并且将浪费大量的时间。对此&#xff0c;解决方案是&#xff1a;主材质&#xff1a;master Materials。 新建一个新关卡…

springboot基于java的个性化推荐的电商购物商城平台设计与实现

本文主要探讨了个性化推荐的电商平台的设计与实现。并对其详细的设计方案、实现技术和运行情况做了分析和研究&#xff0c;最后对未来的工作做了研究与探讨。本文重点研究了以下几个方面&#xff1a; &#xff08;1&#xff09;系统的体系结构、主要功能模块、主要数据的工作流…

次元裂缝已打开,AI绘画突飞猛进,其潜力究竟有多大

目录 次元裂缝已打开 AI绘画 起源 人工智能画的画在美术比赛得第一名 原理 关键的CLIP 总结 次元裂缝已打开 #次元裂缝已打开#的一个话题火了~大量新人老玩家共赴无界AI 上面是AI绘画根据真实图片合成的图片与真图的对比&#xff0c;可以看出还原度还是很高的&#xff…