参考: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. Error: Could not link: /usr/local/share/doc/homebrew

    mac 执行brew update 报错 Error: Could not link: /usr/local/share/doc/homebrew 更新brew,报错 Error: Could not ...

  2. C++字符串前面加LR

    const std::experimental::filesystem::path symbolsFilename = LR"(d:\fulongtech_git\draing_recogn ...

  3. mv- Linux必学的60个命令

    1.作用 mv命令用来为文件或目录改名,或者将文件由一个目录移入另一个目录中,它的使用权限是所有用户.该命令如同DOS命令中的ren和move的组合. 2.格式 mv[options] 源文件或目录 ...

  4. CCA Spark and Hadoop 开发者认证技能点【2016只为hadoop达到巅峰】

    Required Skills 技能要求: Data Ingest 数据消化: The skills to transfer data between external systems and you ...

  5. Django中间件分析

    SessionMiddleware 浏览器会发送包含SESSION_COOKIE_NAME的的Cookie 中间件从django_session中按照SESSION_COOKIE_NAME取出存入的s ...

  6. vue.js_05_vue.js的过滤器

    1.过滤器的定义和使用 实现:将页面的中的单纯替换成,用户传来的文字. 全局过滤器:所有的Vue对象都可以使用 <body> <div id="app"> ...

  7. 你真的了解cookies吗?

    互联网隐私安全,直接放链接吧,这一篇非常好的文章,详细,全面,专业. http://www.freebuf.com/articles/web/127266.html 浅谈Web客户端追踪 一.   W ...

  8. docker 整理

    管理 docker批量删除容器.镜像   1.删除所有容器 docker rm `docker ps -a -q` 1.1 按条件删除容器 删除包含某个字段 ,镜像名或容器名均可, 例如删除 zhy* ...

  9. idea如何清晰地查看java类的继承结构及该类的所有方法?

    转载自:https://blog.csdn.net/luo609630199/article/details/82192938 我们在世用idea是平时除了编码外,有时我们需要查看源码或者别人写的代码 ...

  10. hibernate 一对一注解

    bi如 用户的阅读历史和文章表是单向一对一关系, 阅读历史中通过deviceId外键关联文章表的主键 然后,再从getter setter上进行注解 @OneToOne(cascade = Casca ...