最短路径问题

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

[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3790

【解题思路】Dijk + heap【单元最短路】既然有两考虑的因素,而且分优先,那么优先队列排列比较的时候就先考虑路径长度,在路径长度相等的前提下在考虑花费的大小,即路径小花费少的先出,在细节进队的时候也是这样考虑,过一遍Dijk最后输出需要的值

【PS】刚学最短路,一开始没考虑清楚,不知该如何下手,但知道问题出在对Dij算法的掌握程度上,如果像之前的刚学的最短路情形(只有一个考虑的元素),估计也会敲出来,后来自己实现了这题的代码时,发现思路也是一样的,单个因素的最短路中, 进队的时候判断能否进队用的是小于关系运算符,如果也存在多条最短路的时候,因为小于关系运算的缘故,这时起始点到这个点的相同长度的最短路径不会进队列(因为已有进入队列的相同长度的路径),但如果还有考虑的因素时,这是就不一样了,像这题,在路径长度的判断上就要改用小于等于关系运算符,因为在路径长度相等的时候,其还有次要考虑因素,这时,次要考虑因素的比较上就需要用到小于关系运算符。

一开始考虑错误的方向是将从源点到终点整条最短路径与其最小花费进行权衡,没有考虑到:在优先队列中,一出队列,如果之前没有被访问,那么就意味着锁定了这个点的最短路径和最小花费,再次困扰的是此时的点是如何如何影响到后续点的路径和花费,所以不敢确定了是否该这样进行。最后想到:假设其(当前出队列的点)只有一条最短路径,那么就可以放心的往下进行,因为这种情况回到了单个考虑因素的情况嘛,如果有多条最短路径呢?那么其肯定都在队列当中,你现在就要做的就是在其中找到一条最优的(根据次要因素判断)出队列才行,根据自己的理解,感觉还是不太够成熟 ^_^

一直不敢对Dij等各种算法用得理直气壮,该学的是思想,这是最重要的,别拿着别人的算法用得好像是自家的似的。

 #include <cstdio>
#include <queue>
#include <cstring> using namespace std; const int NV = ;
const int NE = ;
const int INF = <<;
int ne, nv, term, tern, tot;
bool vis[NV];
int dist[NV];
int purse[NV];
struct Edge{
int v, cost, money, next;
Edge(){}
Edge(int a, int c, int m){v = a, cost = c, money = m;}
Edge(int a, int c, int m, int d){v = a, cost = c, money = m, next = d;}
bool operator < (const Edge& x) const
{
if(cost != x.cost) return cost > x.cost;
else return money > x.money;
}
}edge[NE];
int eh[NV]; void Dij(int s)
{
for(int i = ; i <= nv; ++i) purse[i] = dist[i] = i == s ? : INF;
priority_queue<Edge> que;
que.push(Edge(s, , ));
while(!que.empty())
{
Edge tmp = que.top();
int u = tmp.v;
que.pop();
if(vis[u]) continue;
vis[u] = true;
for(int i = eh[u]; i != -; i = edge[i].next)
{
int v = edge[i].v;
if(!vis[v] && dist[v] >= edge[i].cost + dist[u])
{
if(dist[v] > edge[i].cost + dist[u] ||
(dist[v] == edge[i].cost + dist[u] && purse[v] > edge[i].money + purse[u]))
{
dist[v] = edge[i].cost + dist[u];
purse[v] = edge[i].money + purse[u];
que.push(Edge(v, dist[v], purse[v]));
} }
}
}
return;
} void addedge(int u, int v, int cost, int money)
{
Edge e = Edge(v, cost, money, eh[u]);
edge[tot] = e;
eh[u] = tot++;
return;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
while(scanf("%d%d", &nv, &ne) != EOF && nv+ne)
{
memset(eh, -, sizeof(eh));
memset(vis, false, sizeof(vis));
term = tern = tot = ;
int u, v, cost, money;
for(int i = ; i < ne; ++i)
{
scanf("%d%d%d%d", &u, &v, &cost, &money);
addedge(u, v, cost, money);
addedge(v, u, cost, money);
}
int s, t;
scanf("%d%d", &s, &t);
Dij(s);
printf("%d %d\n", dist[t], purse[t]);
}
return ;
}

HDU ACM 3790 最短路径问题的更多相关文章

  1. ACM: HDU 3790 最短路径问题-Dijkstra算法

    HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Des ...

  2. HDU - 3790 最短路径问题 (dijkstra算法)

    HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...

  3. hdu acm 1028 数字拆分Ignatius and the Princess III

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  4. HDU 3790最短路径问题 [最短路最小花费]

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)  ...

  5. hdu 3790 最短路径问题(双重权值,dijkstra算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...

  6. hdu 3790 最短路径问题(两个限制条件的最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...

  7. HDU 3790 最短路径问题 (最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...

  8. #HDU 3790 最短路径问题 【Dijkstra入门题】

    题目: 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. 题解报告:hdu 3790 最短路径问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...

随机推荐

  1. ABP实践(3)-ASP.NET Core 2.x版本(从创建实体到输出api)简单实现商品列表及增删改

    项目基于前两篇文章. 本章创建一个简单版的商品管理后台api,用到EF Core用code fist迁移数据创建数据库. 创建Goods实体 在领域层xxx.Core项目[新建文件夹Goods;文件夹 ...

  2. 移动端自动化测试-AppiumApi接口详解

    Appium 初始化配置信息(Desired Capabilities),Desired Capabilities实际上就是一个字典,它主要用于向Appium Server提供初始化配置参数,如:想要 ...

  3. 搭建oracle linux虚拟机报错解决

    sysctl -P 报错解决办法问题症状修改 linux 内核文件 #vi /etc/sysctl.conf后执行sysctl  -P 报错error: "net.bridge.bridge ...

  4. JavaWeb学习 (十二)————使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  5. MyBatis从入门到放弃五:调用存储过程(SQLServer2012)

    前言 如果是相对于复杂的SQL逻辑我们肯定是基于存储过程开发,这篇学习下执行存储过程,调用存储过程如果参数较多我们可以创建parameterMap. 搭建开发环境 开发环境和上篇文章保持相同 创建存储 ...

  6. MySQL基准测试(二)--方法

    MySQL基准测试(二)--方法 目的: 方法不是越高级越好.而应该善于做减法.至简是一种智慧,首先要做的是收集MySQL的各状态数据.收集到了,不管各个时间段出现的问题,至少你手上有第一时间的状态数 ...

  7. Sharepoint 2010 工作流状态值

    在Sharepoint2010中,如果要使用工作流状态值进行筛选,必须使用内部值,不能使用文字,要不然是筛选不出来的. 进行中:2 已取消:4 已批准:16 拒绝:17 下边是已取消的工作流状态:

  8. windows server 证书的颁发与IIS证书的使用

    最近工作业务要是用服务器证书验证,在这里记录下一. 1.添加服务器角色 [证书服务] 2.一路下一步直到证书服务安装完成; 3.选择圈选中的服务器证书 4.点击[创建证书申请] 5.填写信息 6.下一 ...

  9. 浩顺考勤机二次开发(第二版,附实测可用的demo)

    1.背景 之前写过一次浩顺考勤机的二次开发,不过那个版本还是有一些问题,后来更换了新的考勤机,又拿到了新的二次开发包,所以就有了这次这个版本 2.关于考勤机的一些说明 2.1 首先要给考勤机设定ip, ...

  10. MVC四大筛选器—ActionFilter&ResultedFilter

    AuthorizeFilter筛选器 在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行. MVC4中筛选器都是以AOP(面向 ...