最短路径问题

Problem Description
给你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
5 7
1 2 5 5 
2 3 4 5
1 3 4 6
3 4 2 2
3 5 4 7
4 5 2 4
1 3 4 4
1 5
 
0 0
 
Sample Output
9 11
8 10
 #include<iostream>
#include<cstring>
using namespace std;
const int oo=;
int **weight,**profit;//权值和花费
int s,e;
int n,m;
int *low,*vis,*lowp,*pre;
int**Apply_space(int n)
{
int **p;
p=new int*[n+];
for(int i=;i<=n;i++)
p[i]=new int[n+];
return p;
}
void dijkstra()
{
for(int i=;i<=n;i++)
{
low[i]=weight[s][i];
lowp[i]=profit[s][i];
pre[i]=s;//初始化路径
}
low[s]=lowp[s]=;
vis[s]=;
pre[s]=;
for(int i=;i<n;i++)
{
int v;
int Min=oo;
for(int j=;j<=n;j++)
if(!vis[j]&&low[j]<Min)
{
Min=low[j];
v=j;
}
vis[v]=;
for(int j=;j<=n;j++)
{
if(!vis[j]&&low[j]>low[v]+weight[v][j])
{
low[j]=low[v]+weight[v][j];
lowp[j]=lowp[v]+profit[v][j];
pre[j]=v;//标记路径
}
else if(!vis[j]&&low[j]==low[v]+weight[v][j])
{
if(lowp[j]>=lowp[v]+profit[v][j])
{
lowp[j]=lowp[v]+profit[v][j];
pre[j]=v;//标记路径
}
}
}
}
}
void dfs(int i)//输出路径
{
if(pre[i]==)
{
cout<<i<<" ";
return;
}
int j=pre[i];
dfs(j);
cout<<i<<" ";
}
int main()
{
while(scanf("%d %d",&n,&m)==&&(n||m))
{
profit=Apply_space(n);
weight=Apply_space(n);
low=new int[n+];
vis=new int[n+];
lowp=new int[n+];
pre=new int[n+];
for(int i=;i<=n;i++)
{
vis[i]=;
} for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
profit[i][j]=(i==j)?:oo;
weight[i][j]=(i==j)?:oo;
}
int a,b,c,d;
for(int i=;i<=m;i++)
{
scanf("%d %d %d %d",&a,&b,&c,&d);
if(weight[a][b]>c)
{
weight[a][b]=weight[b][a]=c;
profit[a][b]=profit[b][a]=d;
}
else if(weight[a][b]==c)
{
if(profit[a][b]>d)
{
profit[a][b]=profit[b][a]=d;
}
}
}
scanf("%d %d",&s,&e);
dijkstra();
printf("%d %d\n",low[e],lowp[e]);
//dfs(e);//记录路径使用
delete []profit;delete []weight;delete []low;delete []vis;
delete []pre;
}
return ;
}

ACM3790迪杰斯特拉算法运用的更多相关文章

  1. C#迪杰斯特拉算法

    C#迪杰斯特拉算法 网上有许多版本的,自己还是写一个理解点 Dijkstra.cs public class Dijkstra { private List<Node> _nodes; p ...

  2. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  3. 【算法杂谈】LJX的迪杰斯特拉算法报告

    迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...

  4. C# 迪杰斯特拉算法 Dijkstra

    什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...

  5. 迪杰斯特拉算法——PAT 1003

    本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...

  6. dijkstra算法(迪杰斯特拉算法)

    dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...

  7. 迪杰斯特拉算法c语言实现

    /*http://1wangxiaobo@163.com 数据结构C语言版 迪杰斯特拉算法  P189 http://1wangxiaobo@163.com 编译环境:Dev-C++ 4.9.9.2  ...

  8. HDU6166-Senior Pan-Dijkstra迪杰斯特拉算法(添加超源点,超汇点)+二进制划分集合-2017多校Team09

    学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memor ...

  9. Dijkstra【迪杰斯特拉算法】

    有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...

随机推荐

  1. 标注点(Labeled Point)

    标注点LabeledPoint是一种带有标签(Label/Response)的本地向量,它可以是稠密或者是稀疏的.在MLlib中,标注点在监督学习算法中被使用.由于标签是用双精度浮点型来存储的,故标注 ...

  2. 56[LeetCode] .Merge Intervals

    Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...

  3. Python3 Tkinter-PaneWindow

    1.向PanedWindow中添加Pane from tkinter import * root=Tk() panes=PanedWindow(orient=VERTICAL) panes.pack( ...

  4. Python3 循环表达式

    一 While循环 基本循环 while 条件: 执行内容 #循环体 ... #循环体 ... #循环体 # 若条件为真,执行循环体内容 # 若条件为假,不执行循环体内容 实例1(Python 3.0 ...

  5. Javascript动态方法调用与参数修改的问题

    Javascript中可以对所传参数在函数内进行修改,如下 ? 1 2 3 4 5 function func1(name) {     name = 'lily';     alert(name); ...

  6. ARKit----学习一

    一.ARKit的简介 开始进入正题吧 ARKit在iOS 11上推出的一个AR移动平台,支持A9以上的处理器,不支持模拟器.ARKit使用相机捕捉现实世界,使用SceneKit,SpriteKit或者 ...

  7. mini2440 Nor Flash工作原理分析

    我的mini2440上是只接了一块Nor Flash,型号是S29AL016M90TAI02,这是一块2M Byte,16位宽度的Nor Flash,用于引导扇区的闪存.原理图里面关键的引脚是: 地址 ...

  8. 【Asp.Net】IIS应用程序池添加ASP.NET v4.0

    可能在安装.NET Framewrok 4.0之前,IIS就已经装好了,结果在IIS的应用程序池中只有.NET 2.0的Classic .NET AppPool和DefaultAppPool.在使用v ...

  9. [转]MATLAB cell数据类型

    细胞型数据类型(cell)使不同类型和不同维数的数组可以共存,细胞型数组实际上可以认为是一种以任意形式的数组为分量的多维数组. 1.细胞型数据的定义 1)直接赋值定义:细胞型变量在定义时需要使用大括号 ...

  10. usebean 使用语法