<数据结构>XDOJ327.最短路径
问题与解答
问题描述
求图中任意两个顶点之间的最短路径。
输入格式
输入数据第一行是一个正整数,表示图中的顶点个数n(顶点将分别按0,1,…,n-1进行编号)。之后的n行每行都包含n个整数,第i行第j个数表示顶点i-1和顶点j-1之间的边长,用10000来表示两个顶点之间无边。后面每行2个数字,表示一对待求最短路径的顶点,用-1 -1表示输入结束,-1 -1不求解。
输出格式
每对待求最短路径的顶点输出两行数据:第一行输出两个顶点间的最短路径长度,第二行输出最短路径,要按顺序输出顶点编号序列,顶点间用空格隔开。当两个顶点间没有路径时,只在一行上输出字符串“NO”。
样例输入
7
0 12 10000 10000 10000 10000 10000
12 0 10000 10000 3 10000 10000
10000 10000 0 10000 10000 21 11
10000 10000 10000 0 10000 10000 10000
10000 3 10000 10000 0 10000 8
10000 10000 21 10000 10000 0 10000
10000 10000 11 10000 8 10000 0
0 2
0 3
5 0
2 1
1 5
-1 -1
样例输出
34
0 1 4 6 2
NO
55
5 2 6 4 1 0
22
2 6 4 1
43
1 4 6 2 5
//最短路径
//求出所给两点之间的最短路径长度 并 输出最短路径
// Dijstra算法
#include<stdio.h>
#include<algorithm>
#include<stack>
using namespace std;
#define MaxN 100
#define INF 10000 //G[i][j] == INF表示i,j之间无边
int n; //顶点数
int G[MaxN][MaxN]; //邻接矩阵表示图
int d[MaxN]; //d[i]表示i到起点的距离
int path[MaxN]; //存储最短路径
bool Vis[MaxN] = {false}; //Vis[i]==true表示i已被访问
int Dijstra(int u, int v); //Dijstra算法
void PrintPath(int start, int end); //输出路径
int main(){
int start,end,Min_Length;
int i,j;
scanf("%d",&n); //输入顶点
for(i = 0; i < n; i++){ //输入图的邻接矩阵
for(j = 0; j < n; j++)
scanf("%d",&G[i][j]);
}
while(1){ //多点测试
scanf("%d%d",&start,&end);
if(start == -1 && end == -1) return 0; //结束程序
Min_Length = Dijstra(start, end); //调用Dijstra算法
if(Min_Length == -1) printf("No\n"); //打印结果
else{
printf("%d\n", Min_Length);
PrintPath(start,end);
}
}
}
int Dijstra(int start, int end){
fill(d, d+n, INF); //初始化各数组
d[start] = 0;
fill(Vis,Vis+n,false);
path[start] = start;
int i,u,v,Min;
for(i = 0; i < n; i++){ //循环n次
u = -1, Min = INF;
for(v = 0; v < n; v++){ //寻找未被访问的,距离起点距离最短的点
if(Vis[v] == false && d[v] < Min){
u = v;
Min = d[v];
}
}
if(u == -1) break; //图不连通,中断循环
Vis[u] = true; //标记已访问的点
for(v = 0; v < n; v++){ //以u为中介点对其未被访问的邻接点进行优化
if(G[u][v] != INF && Vis[v] == false
&& d[u] + G[u][v] < d[v])
{
d[v] = d[u] + G[u][v];
path[v] = u; //v的父(前驱)节点是u
}
}
}
if(d[end] == INF) return -1; //start与end不连通,不存在最短路径
else return d[end];//返回最短路径的长度
}
void PrintPath(int start, int end){ //输出最短路径
stack<int> s;
int i = end;
s.push(end); //终点入栈
while(path[i] != i){
s.push(path[i]); //父(前驱)节点入栈
i = path[i];
}
while(!s.empty()){ //输出
printf("%d ",s.top());
s.pop();
}
printf("\n");
}
题后反思:调试记录
程序出错
忽略了Vis数组:
- 与起点距离最短的点必须是“未被访问过的”
- 而后要标记为“已访问”
- 需要更新的邻接点必须是“未被访问过的”
在源代码基础上的改动
源代码:Dijstra算法
增加输入变量并改变有顶点不连通时的行为
- 源代码输入起点start,计算start到其他所有顶点的最短距离,若有顶点不连通则函数返回-1
- 改动后
- 输入起点start 和 终点end, 若有顶点不连通则中断for循环
- 根据d[end]是否==INF判断输出-1还是d[end](start与end的最小值)
增加path[]数组记录路径【父节点树/并查集】
- path[v] = u表示 v的父节点是u
- 沿path遍历父节点,入栈再出栈得到最短路径
<数据结构>XDOJ327.最短路径的更多相关文章
- 数据结构——图——最短路径D&F算法
一.Dijkstra算法(贪心地求最短距离的算法) 在此算法中,我按照自己的理解去命名,理解起来会轻松一些. #define MAXSIZE 100 #define UNVISITED 0 #defi ...
- 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)
数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...
- 数据结构 -- 图的最短路径 Java版
作者版权所有,转载请注明出处,多谢.http://www.cnblogs.com/Henvealf/p/5574455.html 上一篇介绍了有关图的表示和遍历实现.数据结构 -- 简单图的实现与遍历 ...
- 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)
上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...
- 数据结构与算法--最短路径之Bellman算法、SPFA算法
数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...
- 数据结构与算法--最短路径之Floyd算法
数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...
- 数据结构与算法--最短路径之Dijkstra算法
数据结构与算法--最短路径之Dijkstra算法 加权图中,我们很可能关心这样一个问题:从一个顶点到另一个顶点成本最小的路径.比如从成都到北京,途中还有好多城市,如何规划路线,能使总路程最小:或者我们 ...
- 数据结构实习 Problem H 迷宫的最短路径
数据结构实习 Problem H 迷宫的最短路径 题目描述 设计一个算法找一条从迷宫入口到出口的最短路径. 输入 迷宫的行和列m n 迷宫的布局 输出 最短路径 样例输入 6 8 0 1 1 1 0 ...
- 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )
数据结构实验之图论七:驴友计划 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
随机推荐
- rem.js,移动多终端适配
window.onload = function(){ /*720代表设计师给的设计稿的宽度,你的设计稿是多少,就写多少;100代表换算比例,这里写100是 为了以后好算,比如,你测量的一个宽度是10 ...
- NERD_commenter快捷键
快捷键有点多,记不过来,做个备份 1. \cc 注释当前行和选中行 2. \cn 没有发现和\cc有区别 3. \c<空格> 如果被选区域有部分被注释,则对被选区域执行取消注释操作,其它情 ...
- linux修改文件权限命令
先看个实例: [root@local opt]#ls -al ls -al 命令是列出目录的所有文件,包括隐藏文件.隐藏文件的文件名第一个字符为'.' -rw-r--r-- 1 root root ...
- 利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired
大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService {@Autowiredprivate UserService userServic ...
- Oracle bulk collect into 的几种用法
bulk collect 和 forall 联合应用写起来显得有些啰嗦,不过为了速度,多写两句又何妨 建立两个临时表 create table T_TEST ( TESTID NUMBER(19) n ...
- 【Java】面向类与对象
一.面向对象 对象封装:私有变量+公共方法 方法与构造方法 this变量 Animal.java public class Animal { String name; int age; void mo ...
- 利用代码覆盖率提高嵌入式软件的可靠性 - VectorCAST
简介 代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例 计算得出.代码覆盖率可以有效避免包含未测试代码的程序被发布. 代码覆盖率能不能提高软件的可靠性?答案是肯定的,代 ...
- java基础---局部变量和全局变量
1.成员变量的概念: 成员变量就是属于类的变量,在类中,方法体外定义的变量 1)成员变量又分为两种: 类变量(又称静态变量) 实例变量(又称非静态变量) 类变量(静态变量) :是被static所修 ...
- Jenkins安全加固
1.jenkins未授权访问 描述 jenkins不当配置可导致未授权访问管理控制台,可以通过脚本命令行执行系统命令.通过该漏洞,可以后台管理服务,通过脚本命令行功能执行系统命令,如反弹shell,w ...
- 如何查看Python的安装路径
一.如何查看Python的安装路径 win+r输入cmd在输入:where python回车