第六章 图论 8 AcWing 1624. 地铁地图
创始人
2024-02-01 00:54:56

第六章 图论 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
#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)
using namespace std;
typedef pair 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, greater> 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 path;cout<>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-kif(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总视频讲解

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

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
南美洲有哪些国家 南美洲一共有... 南美洲是南亚美利加洲的简称,位于西半球,南美洲大部分地区位于南半球,南美洲东临大西洋,西临太平洋,南...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
南美洲有哪些国家 南美洲一共有... 南美洲是南亚美利加洲的简称,位于西半球,南美洲大部分地区位于南半球,南美洲东临大西洋,西临太平洋,南...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...