最短路径问题

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. maven多环境参数配置

    maven中properties加载顺序 <build><filters></filters></build>中的配置 pom.xml中的<pro ...

  2. js仿qq分组折叠效果

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. 理解交叉熵(cross_entropy)作为损失函数在神经网络中的作用

    交叉熵的作用 通过神经网络解决多分类问题时,最常用的一种方式就是在最后一层设置n个输出节点,无论在浅层神经网络还是在CNN中都是如此,比如,在AlexNet中最后的输出层有1000个节点: 而即便是R ...

  4. CSS hack兼容表

    IE6 IE7 IE8 Firefox Opera Safari !important Y Y Y Y Y _ Y * Y Y *+ Y \9 Y Y Y \0 Y nth-of-type(1) Y ...

  5. jquery插入,复制、替换和删除节点

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  6. golang map输出排序

    由于GoLang Map 内部存储是无序的,当需要按顺序获得map存储的key -value值时,应该对遍历出来的结果进行重新排序: 在go 1.8版本后,提供的slice sort 功能使排序更简单 ...

  7. dom操作------获取长/宽/距离等值的若干方法

    1.offsetLeft:获取元素边框以外至文档顶的距离:若其祖先元素有定位属性position则返回值为元素到该定位元素的距离,不包括祖先元素的三宽(padding,border,margin),且 ...

  8. [转]Git & Gitlab 使用指南

    本文转自:https://blog.csdn.net/zdx1515888659/article/details/72954000 原文:http://www.restran.net/2016/02/ ...

  9. Sharepoint 2010 工作流状态值

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

  10. SQL 数据库加字段声明

    ALTER TABLE dbo.C_TrainPlan ADD MailCost DATETIME EXECUTE sp_addextendedproperty N'MS_Description', ...