刚看到题目的时候马上就想到要用【邻接矩阵】存储边,并且用 Dijkstra算法求最短路径,但是提交代码后,检测结果是“运行错误”,内存使用非常大。

再重新看一遍题目,发现数据规模中节点数目的平方远大于边的数目,所以用邻接矩阵存储是非常浪费内存的。

查找相关课本,图一般有四种存储方式:

    1、邻接矩阵:形式简单,常用于节点数较少时,或者节点信息较少时,或是节点数的平方和边的数目较为相近时候。否在将耗费较大的空间资源。

    2、邻接表:在边稀疏或当和边相关的信息较多时采用邻接表存储图将会比邻接矩阵节省存储空间

    3、十字链表:结构相对前种复杂,一般用于有向图

    4、临界多重表:一般用于无向图

显然,对于本题来说,采用邻接表存储图是比较合理的。并且采用队列以辅助寻找最短路径。

#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std;
const int maxsize=200000;
const int inf = 1000000;//边节点
typedef struct XNode
{int pow;int adjvex;struct XNode* next;
}Node;Node* head[maxsize];//头节点
int visit[maxsize],dist[maxsize];//添加边
void AddAdj(int u,int v,int l)
{Node *p;p = (Node*)malloc(sizeof(Node));p->pow=l;p->adjvex=v;p->next=head[u]->next;head[u]->next=p;
} //求最短路径
void shortpath(int n)
{int i,j,u,v,w;queue<int> Q;Node *p;for(i=1;i<=n;i++){visit[i]=0;dist[i]=inf;}//第一个节点入队列 Q.push(1);dist[1]=0;visit[1]=1;while(!Q.empty()){u=Q.front();Q.pop();//求与定点u邻接的所有顶点的最短路径for(p=head[u]->next;p!=NULL;p=p->next){v=p->adjvex;w=p->pow;if(dist[u]+w<dist[v]){dist[v]=dist[u]+w;//过点u到达v的路径比原路径短if(!visit[v])//若节点未被访问过{visit[v]=1;Q.push(v);}}}}}int main()
{int n,m,u,v,w;scanf("%d%d",&n,&m);int i;for(i=1;i<=n;i++)//初始化头结点{head[i]=(Node*)malloc(sizeof(Node));head[i]->next=NULL;}for(i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);AddAdj(u,v,w);}shortpath(n);for(i=2;i<=n;i++)printf("%d\n",dist[i]);return 0;
}

优化改进后的通用代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
using namespace std;const int MaxSize = 100000;
const int Inf = 10000;//无穷大定义 //边节点定义
typedef struct XNode
{int asc,pow;XNode* next;
}Node;//头节点定义
typedef struct XHead
{int data;  //顶点标识 int pre; //最短路径中的前一个节点下标 Node* firstvex;
}Head;Head head[MaxSize];
int dist[MaxSize],visit[MaxSize],path[MaxSize];//添加边
void InserAsc(int u,int v,int w)
{Node* p;p=(Node*)malloc(sizeof(Node));if(!p)exit(-1);p->asc=v;p->pow=w;p->next=head[u].firstvex;head[u].firstvex=p;
}//求节点总数为n,的顶点vex到其余各点的最短路径
void Dijstr(int n,int vex)
{int i,j;queue<int> Q;//初始化 for(i=1;i<=n;i++){dist[i]=Inf;visit[i]=0;path[i]=0;head[i].pre=0;}int u,v,w,k;Node* p;visit[vex]=1;dist[vex]=0;k=0;Q.push(vex);while(!Q.empty()){u=Q.front();Q.pop();for(p=head[u].firstvex;p!=NULL;p=p->next){v=p->asc;w=p->pow;if(dist[u]+w<dist[v]){dist[v]=dist[u]+w;head[v].pre=u;if(visit[v]==0){Q.push(v);visit[v]=1;}}}}}//递归显示点v1到点v2的最短路径
void displaypath(int v1,int v2)
{if(v2==0)return;else if(v2==v1){printf("%d ",v1);}else{displaypath(v1,head[v2].pre);printf("%d ",v2);}
}int main()
{int i,j,n,m,u,v,w;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){head[i].data=i;head[i].firstvex=(Node*)malloc(sizeof(Node));head[i].firstvex=NULL;}for(i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);InserAsc(u,v,w);}int vex;printf("请输入源点:");scanf("%d",&vex);Dijstr(n,vex);printf("点%d到其余各点的最短距离:\n",1);for(i=1;i<=n;i++){if(dist[i]!=Inf)printf("%d\n",dist[i]);else printf("Inf\n");}printf("最短路径:\n");for(i=1;i<=n;i++){if(i==vex)continue;printf("点%d到点%d的最短路径:\n",1,i);displaypath(vex,i);printf("\n");}return 0;
}

转载于:https://www.cnblogs.com/tangshiguang/p/6770723.html

蓝桥杯 单点最短路径问题相关推荐

  1. 蓝桥杯国赛知识点汇总

    蓝桥杯国赛备赛总结知识点,以老师给的为原型,添加自己理解,供大家参考,后期不定时更新. 基础 1.熟练掌握API1.8常用方法 2.大数(高精度)加减乘除 3.并查集 模板: public class ...

  2. 2021年12届蓝桥杯C++B组省赛

    2021年12届蓝桥杯C++B组省赛 路径 自己的写法 #include <cstring> #include <cstdio> #include <cmath> ...

  3. 蓝桥杯节点选择(java)第一道树形dp分析

    蓝桥杯 节点选择 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多少? 输入格式 第一行包含一个整数 ...

  4. 蓝桥杯最短路(java过)spfa单源最短路算法

    spfa 百度百科上spfa的思路为:动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最 ...

  5. 2021年第十二届蓝桥杯 - 省赛 - C/C++大学A组 - D.路径

    2021年第十二届蓝桥杯 - 省赛 - C/C++大学A组 - D.路径 Ideas 算法:最短路径 数据结构:图 思路:根据规则构图,单源最短路径Dijkstra算法. 首先构图其实很简单,就是按照 ...

  6. 45行代码AC_2017年第八届蓝桥杯C/C++ A组第二题(广搜模板+解题报告)

    问题描述 有9只盘子,排成1个圆圈. 其中8只盘子内装着8只蚱蜢,有一个是空盘. 我们把这些蚱蜢顺时针编号为 1~8   每只蚱蜢都可以跳到相邻的空盘中, 也可以再用点力,越过一个相邻的蚱蜢跳到空盘中 ...

  7. 蓝桥杯 第十届 JAVAB组 E迷宫

    /*试题 E: 迷宫 本题总分:15 分 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方. 010000 000100 001001 110000 ...

  8. 刷算法题需要的java语法_蓝桥杯java b组需要重点刷什么算法呢?

    我觉得这个问题我很适合回答.不过距离我最后一次参赛,已经有了三年,所以回答的内容重点可能有点偏(建议你,可以到网上找找最新的获奖选手赛后总结看看),但是我觉得应该对你有用. 我本科也在湖北,并且参加过 ...

  9. 第十二届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组解析

    第十二届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组 试题 A: 空间 试题 B: 卡片 试题 C: 直线 试题 D: 货物摆放 试题 E: 路径 试题 F: 时间显示 试题 G: 砝码称重 试题 ...

最新文章

  1. Java 的 API、JDK 和 IDE 是什么
  2. Oracle与JCP执行委员会分享了他们的Java EE策略
  3. jackson的jar包下载
  4. 《算法基础》——2.3 求幂运算
  5. poj 2079(旋转卡壳)
  6. 【JZOJ3636】【BOI2012】Mobile(mobile)
  7. 编译maven_头条一面竟然问我Maven?
  8. Linux有趣指令(二)
  9. 这个深度学习工业质检工具,效率提升30%,质量提高80%
  10. 两台设备有三条链路,请问如何添加?
  11. 神经网络绘图工具-总结
  12. 默认空间和webapps下项目部署
  13. 关于eclipse总是出现adb refused request的问题(转)
  14. html网页模板如何修改,如何修改和管理网站模板
  15. imdisk 想说爱你不容易
  16. (原博客转移)诺基亚手机成板砖无法开机后,强刷修复手机系统的方法!本人亲测
  17. python aic准则_赤池信息准则AIC,BIC
  18. 微型计算机第十一章答案,计算机习题答案总.docx
  19. 个推数说中国42年冬奥史,可视化演绎冰雪奇缘
  20. 大型传统企业的数字化创新之路

热门文章

  1. Mvvm 前端数据流框架精讲
  2. AgileEAS.NET敏捷开发平台案例-药店系统-项目说明
  3. Vue为何采用异步渲染
  4. 小程序css之字体镂空
  5. DevOps vs Agile:有什么区别?
  6. 两大开源硬件之树莓派与a_开源硬件之美
  7. 十个人在一座荒岛上_如果您在荒岛上,您将携带哪个执照?
  8. xcom2.0_发布Xcom 2,Elliot Quest,Mesa图形库以及更多开放式游戏新闻
  9. (52)CSS hack
  10. WebSocket | 为什么你前后端推送不会用?因为你少了WebSocket的帮忙