最短路径问题

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. commons-lang源码解析之StringUtils

    apache的commons工具包是平时使用最多的工具包之一,对其实现方式需要具体了解.commons-lang version 3.1 empty和blank的区别 StringUtils中判断St ...

  2. 校招小白机考入坑之从键盘输入java的各种数据类型

    //1.从键盘输入一个整型(其他基本类型类似) Scanner sc =new Scanner(System.in); sc.hasNextInt(); int str1 = sc.nextInt() ...

  3. 【Linux 运维】 安装PHP工具Composer

    一.安装PHP 由于Composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的 ...

  4. leetcode9_C++判断一个整数是否是回文数

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 输出: true 示例 2: 输入: - 输出: false 解释: 从左向右读, 为 - ...

  5. 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现

    引入 快慢指针经常用于链表(linked list)中环(Cycle)相关的问题.LeetCode中对应题目分别是: 141. Linked List Cycle 判断linked list中是否有环 ...

  6. 【转载】JAVA常见面试题及解答(精华)

     JAVA常见面试题及解答(精华)       1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: ...

  7. Document对象内容集合

    document 文挡对象 - JavaScript脚本语言描述———————————————————————注:页面上元素name属性和JavaScript引用的名称必须一致包括大小写否则会提示你一 ...

  8. C语言--链表基础模板

    1.建立结构体 struct ST { int num;///学号 int score;///成绩 struct ST*next; };///结构体 2.空链表的创建 struct ST creatN ...

  9. winform Form窗体和UserControl用户空间嵌入Panel容器并填充

    private void sbtbflList_Click(object sender, EventArgs e) { ucxmflList ucfl = new ucxmflList();//用户控 ...

  10. 3dContactPointAnnotationTool开发日志(七)

      调了半天发现是逻辑错误,改了一下终于没那么奇怪了:   但是有的接触点很明显跑偏了.再回顾一下自己是怎么求的,我是直接用的下面的代码求解一个点是否在另一个物体内部: var bounds = us ...