参考:https://www.cnblogs.com/qiufeihai/archive/2012/03/15/2398455.html

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2622    Accepted Submission(s): 825

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
0 0
 
Sample Output
9 11
 
 
注意点: 题中所给的输入数据有可能有多条长度相等,但花费不同的数据,在输入处理的时候需要进行判断,选出花费最少的情况!
 
 #include <stdio.h>
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <sstream> #define INF 1000000000 using namespace std; int dis[];
int vis[];
int cost[];
int n, m; struct node
{
int len;
int cost;
}g[][]; void dijkstra(int start)
{
for(int i = ; i <= n; ++i)
{
dis[i] = INF;
cost[i] = INF;
}
dis[start] = ;
cost[start] = ; while()
{
int mark = -, minDis = INF;
for(int i = ; i <= n; ++i)
{
if(!vis[i] && dis[i] < minDis)
{
minDis = dis[i];
mark = i;
}
} if(mark == -)
break;
vis[mark] = ; for(int i = ; i <= n; ++i)
{
if(!vis[i])
{
if(dis[mark] + g[mark][i].len < dis[i])
{
dis[i] = dis[mark] + g[mark][i].len;
cost[i] = cost[mark] + g[mark][i].cost;
}
else if(dis[mark] + g[mark][i].len == dis[i] && cost[i] > cost[mark] + g[mark][i].cost)
{
cost[i] = cost[mark] + g[mark][i].cost;
} }
} }
} int main()
{
while(scanf("%d %d", &n, &m) != EOF)
{
if(n == && m == )
break; memset(vis, , sizeof(vis));
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
{
if(i == j)
g[i][j].len = ;
else
g[i][j].len = INF;
} int a, b, d, p;
for(int i = ; i <= m; ++i)
{
scanf("%d %d %d %d", &a, &b, &d, &p);
/* g[a][b].len = g[b][a].len = d;
g[a][b].cost = g[b][a].cost = p;*/ //这样写会出错,必须下面那样写,因为有可能有长度相同但花费不同的边 if(g[a][b].len > d)
{
g[a][b].len = g[b][a].len = d;
g[a][b].cost = g[b][a].cost = p;
} // 这里很重要!!
if(g[a][b].len == d && g[a][b].cost > p) // 如果长度相等,则存放较少的费用
{
g[a][b].cost = g[b][a].cost = p;
}
} int s, t;
scanf("%d %d", &s, &t);
dijkstra(s); cout << dis[t] << " " << cost[t] << endl;
} return ;
}

最短路径问题 HDU - 3790 (Dijkstra算法 + 双重权值)的更多相关文章

  1. Dijkstra算法为什么权值不能为负

    Dijkstra算法当中将节点分为已求得最短路径的集合(记为S)和未确定最短路径的个集合(记为U),归入S集合的节点的最短路径及其长度不再变更,如果边上的权值允许为负值,那么有可能出现当与S内某点(记 ...

  2. HDU 1533 KM算法(权值最小的最佳匹配)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  3. HDU 3790(两种权值的迪杰斯特拉算法)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=3790 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    ...

  4. HDU 5249:KPI(权值线段树)

    KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...

  5. HDU 2112 HDU Today (Dijkstra算法)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. hdu 1874 Dijkstra算法

    先贴个网上找的比较通俗易懂的教程: 2.1Dijkstra算法(非负权,使用于有向图和无向图) Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心 ...

  7. 最短路径 - 迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  8. 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析

    什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...

  9. 最短路径-迪杰斯特拉(dijkstra)算法及优化详解

    简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...

随机推荐

  1. MVC中视图访问的约定

    通常访问视图的时候,都会去选择访问Views文件夹内对应于Controller同名的文件夹下的某一个视图,这个视图对应于这个Controller类的某一个方法. 其实,也可以让这个方法对应于不同名的c ...

  2. 服务器的tomcat调优和jvm调化

    下面讲述的是tomcat的优化,及jvm的优化 Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你.对于操作系统优化来说,是尽可能的增 ...

  3. [转]Expression Blend实例中文教程(8) - 动画设计快速入门StoryBoard

    上一篇,介绍了Silverlight动画设计基础知识,Silverlight动画是基于时间线的,对于动画的实现,其实也就是对对象属性的修改过程. 而Silverlight动画分类两种类型,From/T ...

  4. 工控安全入门(七)—— plc的网络

    上一篇我们详细分析了bootram和Vxworks的基本启动流程,这篇文章中我们把视线转到plc的网络部分,同时来复现我们第一个.第二个工控安全漏洞. VxWorks的网络设备驱动 一般我们说有三种设 ...

  5. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据   最近碰巧发现一款比较好的Web即时通讯前端组件,layim,百度关键字即可,我下面要做的就是基于这个前 ...

  6. 原生JS实现动态时钟(优化)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. hibernate一对一关联手动改表后No row with the given identifier exists:

    articleId手动改了一个并不存在的值 把被控端的id改成存在的就好了

  8. diango中orm的惰性机制

    那么首先要知道什么是ORM 专业化的角度来说:叫对象关系映射(Object-Relation Mapping)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 那具体ORM是什么呢?:( ...

  9. layui -page 分页类

    <?phpnamespace page; // +---------------------------------------------------------------------- / ...

  10. http://codeforces.com/gym/100623/attachments H题

    http://codeforces.com/gym/100623/attachments H题已经给出来的,包括后来添加的,都累加得到ans,那么从1-ans都是可以凑出来的,如果ans<a[n ...