HDU ACM 3790 最短路径问题
最短路径问题
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 最短路径问题的更多相关文章
- ACM: HDU 3790 最短路径问题-Dijkstra算法
HDU 3790 最短路径问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- HDU - 3790 最短路径问题 (dijkstra算法)
HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...
- 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 ...
- HDU 3790最短路径问题 [最短路最小花费]
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...
- hdu 3790 最短路径问题(两个限制条件的最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...
- HDU 3790 最短路径问题 (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...
- #HDU 3790 最短路径问题 【Dijkstra入门题】
题目: 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 题解报告:hdu 3790 最短路径问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...
随机推荐
- interface21 - web - ContextLoaderListener(Spring Web Application Context加载流程)
前言 最近打算花点时间好好看看spring的源码,然而现在Spring的源码经过迭代的版本太多了,比较庞大,看起来比较累,所以准备从最初的版本(interface21)开始入手,仅用于学习,理解其设计 ...
- transformer 源码
训练时: 1. 输入正确标签一次性解码出来 预测时: 1. 第一次输入1个词,解码出一个词 第二次输入第一次输入的词和第一次解码出来词一起,解码出来第3个词,这样依次解码,解码到最长的长度或者< ...
- RPC的基础:调研EOS插件http_plugin
区块链的应用是基于http服务,这种能力在EOS中是依靠http_plugin插件赋予的. 关键字:通讯模式,add_api,http server,https server,unix server, ...
- ARM64 Linux kernel virtual address space
墙外通道:http://thinkiii.blogspot.com/2014/02/arm64-linux-kernel-virtual-address-space.html Now let's ta ...
- JSP+Servlet+mysql简单示例【图文教程】
下载MYSQL:http://dev.mysql.com/downloads/ 下载安装版的 然后安装(安装步骤就不详细说了) 安装好之后,点击托盘图标,打开管理工具 创建一个数据库 数据库的名字 ...
- HTML XML 介绍
一. HTML(HyperTextMark-upLanguage)即超文本标记语言,是WWW的描述语言. 二. XML即ExtentsibleMarkup Language(可扩展标记语言), XML ...
- js------10种循环方法
let arr = [{a:1},{a:2},{a:3},{a:4},{a:5}]; // 1.while循环 let sum = 0; let num = 1; while(num <= 1) ...
- js jq输入框中按回车触发提交事件,用户在页面输入后按回车(Enter键)进行
js jq输入框中按回车触发提交事件,用户在页面输入后按回车(Enter键)进行 代码如下: <!DOCTYPE html> <html lang="en" xm ...
- C# 快速释放内存的大数组
本文告诉大家如何使用 Marshal 做出可以快速释放内存的大数组. 最近在做 3D ,需要不断申请一段大内存数组,然后就释放他,但是 C# 对于大内存不是立刻释放,所以就存在一定的性能问题. 在博客 ...
- 【Spring】20、使用TransactionSynchronizationManager在spring事务提交之后进行一些操作。
本文内容 如何在spring事务提交之后进行一些操作,这些操作必须得在该事务成功提交后才执行,回滚则不执行. 要点 如何在spring事务提交之后操作 如何在spring事务回滚之后操作 实现方案 使 ...