最短路径问题

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. POJ 3046

    题目大意:蚂蚁牙黑,蚂蚁牙红:有A只蚂蚁,来自T个家族,分别记为ant[i]个.同一个家族的蚂蚁长得一样,但是不同家族的蚂蚁牙齿颜色不同.任取n只蚂蚁(S <= n <= B),求能组成几 ...

  2. 第一个线性回归程序(基于Jupyter)

    import pandas as pdimport seaborn as snssns.set(context="notebook", style="whitegrid& ...

  3. solidity 智能合约操作

    合约编译 #!/usr/bin/env python # coding: utf8 import json import os # Solc Compiler from functools impor ...

  4. 脚本 script 常用脚本

    目录 remove_all_pyc find_all_links rename_with_slice load_json_without_dupes execution_time benchmark_ ...

  5. Some good articles

    https://alligator.io/vuejs/introduction-render-functions/ https://alligator.io/vuejs/vue-jwt-pattern ...

  6. JS判断是IOS还是Android以及如何解决h5打包后在ios下内容与状态栏重叠问题

    h5打包后在ios下内容与状态栏重叠问题: 1:知道设备的类型: var u = navigator.userAgent, app = navigator.appVersion; var isAndr ...

  7. hosts_allow配置了却不生效

    hosts_allow配置了却不生效 配置了两台白名单的机器,一台生效一台不生效,google后的结果都是更新libwrap.so  安装openssh等等..(问题还是没有解决) 经过对比发现,原来 ...

  8. About Dynamic Programming

    Main Point: Dynamic Programming = Divide + Remember + Guess 1. Divide the key is to find the subprob ...

  9. UVALive - 6868 Facility Locations 想法题

    题目链接: http://acm.hust.edu.cn/vjudge/problem/88634 Facility Locations Time Limit: 3000MS 题意 给你一个m*n的矩 ...

  10. Jmeter系列-webdriver插件

    1.下载地址    JMeterPlugins-WebDriver-1.1.2 2.将JMeterPlugins-WebDriver-1.1.2\lib\ext中的*.jar拷贝到D:\apache- ...