给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
Output
输出 一行有两个数, 最短距离及其花费。
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
9 11

用迪杰斯特拉算法求最短路问题,需要注意的是输入过程中可能会出现重边,需要对重边进行判断。如果重边的话需要选择重边中更短的那条边,也应该选择与之对应的花费值。同时由于是多组测试用例,在每次循环中都要进行初始化。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int N,M,s,t;
int Map[1005][1005];
int val[1005][1005];
int dist[100005],value[100005];
int vis[1005];
int INF=1000010;
int FindMinDist()
{int min,mindist=INF;for(int i=1;i<=N;i++){if(vis[i]==0&&dist[i]<mindist){mindist=dist[i];min=i;}}if(mindist<INF)return min;else return -1;
}
void Dijkstra()
{for(int i=1;i<=N;i++){dist[i]=Map[s][i];value[i]=val[s][i];}  vis[s]=1;while(1){int temp=FindMinDist();if(temp==-1)break;vis[temp]=1;for(int i=1;i<=N;i++){if(vis[i]==0&&Map[temp][i]!=INF){if(dist[i]>dist[temp]+Map[temp][i]){dist[i]=dist[temp]+Map[temp][i];value[i]=value[temp]+val[temp][i];}else if(dist[i]==dist[temp]+Map[temp][i]){if(value[i]>value[temp]+val[temp][i])value[i]=value[temp]+val[temp][i];}}}}
}
int main()
{while(scanf("%d %d",&N,&M)&&M!=0&&N!=0){   memset(dist,0,sizeof(dist));memset(val,0,sizeof(val));memset(Map,0,sizeof(Map));memset(vis,0,sizeof(vis));memset(value,0,sizeof(value));for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)if(i==j)Map[i][j]=0;elseMap[i][j]=INF;for(int i=0;i<M;i++){int x,y;scanf("%d %d",&x,&y);if(Map[x][y]==INF)scanf("%d %d",&Map[x][y],&val[x][y]);else{int xx,yy;scanf("%d %d",&xx,&yy);if(xx<Map[x][y]){Map[x][y]=xx;val[x][y]=yy;}}Map[y][x]=Map[x][y];val[y][x]=val[x][y]; }       scanf("%d %d",&s,&t);Dijkstra();printf("%d %d\n",dist[t],value[t]);}return 0;
}

最短路径问题 图论相关推荐

  1. 图论算法之最短路径(Dijkstra、Floyd、Bellman-ford和SPFA)

    图论算法之最短路径(Dijkstra.Floyd.Bellman-ford和SPFA) 1.图论最短路径概述 图论算法为了求解一个顶点到另一个顶点的最短路径,即如果从图中某一顶点(称为源点)到达另一顶 ...

  2. 图论——强连通分量(Tarjan算法)

    文章目录 强连通分量 利用Tarjan算法求强连通分量 来一道例题练手(USACO08DEC) 图论文章汇总 强连通分量 什么是强连通图? 如果一个有向图中,存在一条回路,所有的结点至少被经过一次,这 ...

  3. 含泪总结,五种常见的最短路径算法

    "明月如霜,好风如水,清景无限 " 总结 总的来说,最短路径是图论的最常见的问题.即在一副有向图(无向图是特殊的有向图,不做考虑.记图中的结点数N ,而边数为 M,边长记为W)中找 ...

  4. c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现

    求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...

  5. 【图解算法】一次解决最短路径问题

    今天我们来介绍一下几种图论中常用的求最短路的算法(来源:ACWING) 目录 1. 算法的选择 2. 具体实现 2.1 Dijkstra算法 2.2 朴素Dijkstra 模板题 思路模板 代码实现 ...

  6. 最短路径算法【matlab仿真】

    最短路径问题因为其问题的普遍性,以及应用的实际性,不仅是数据结构的热点问题,也是数学信息学科.计算机学科.地理信息学科等学科的一个研究热点.由于科学技术的不断进步,使得应用数学中的图论与计算机算法与结 ...

  7. TYUT-A专题题解(二)

    TYUT-A专题题解(一) TYUT-A专题题解(二) 36暴力枚举 AOJ0008 Sum of 4 Integers[暴力]_海岛Blog-CSDN博客 HDU1407 测试你是否和LTC水平一样 ...

  8. ACM 各大OJ平台以及题目分类

    本文章转自:http://blog.csdn.net/liujiuxiaoshitou/article/details/7 OJ是Online Judge系统的简称,用来在线检测程序源代码的正确性.著 ...

  9. 计算机学习入门、进阶、Android开发及其它

    注:根据自己粗浅的经验,给师弟师妹写了一篇文章,贴到此处. 一.计算机基础知识 一个典型的计算机专业本科学生掌握的主要有5方面,构成了计算机能力的基础. 一门静态语言 尤其以C++和Java为主.C语 ...

最新文章

  1. oracle ora 14047,ORA-14047: ALTER TABLE|INDEX RENAME 不可以与其它分区组合
  2. (0109)iOS开发之CocoaPods Mac App的安装和使用
  3. VC++读取图像RGB值
  4. Java代理模式/静态代理/动态代理
  5. Python PIL库总结
  6. 04_有序清单无序清单
  7. Android应用程序键盘(Keyboard)消息处理机制分析(11)
  8. LIBAVCODEC_VERSION_INT是哪里定义的?
  9. ecshop源码开发 ticket(电子票)
  10. 【生信技能树】GEO数据库挖掘 P5
  11. STM32传感器外设集--心率模块(MAX30102)
  12. 蛇形填数(语言:C语言)
  13. 2个鸡蛋100层楼--动态规划
  14. 运维工程师发展受限,那么运维转型大数据是个机会吗?
  15. Java高并发秒杀系统【观后总结】
  16. 西安研究所 计算机专业,智能计算研究所
  17. 用友U8打开系统管理报错481
  18. 【FPGA】D触发器的设计并调用D触发器设计4位串行移位寄存器
  19. navigation导航中导航栏的设置
  20. android 设备管理和凭证,设备管理下载-设备管理安卓版下载-Appfound

热门文章

  1. 成员函数的重载,覆盖与隐藏
  2. bash shell 快捷键
  3. 委托函数《重构》----处理概括关系
  4. linq to access 简单实现
  5. 新车可以无牌上路7天_铜竟然可以做成袜子,连穿7天不臭脚!
  6. sqlserver主键自增
  7. contenteditable属性让div也可以当做输入框
  8. 如何连接oracle 12c可插拔数据库
  9. java GC的优化
  10. Subarray Sum