HDU 3790 最短路径问题 (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790
简单的最短路问题,这题听说有重边。我用spfa和dijkstra写了一遍,没判重边,速度都差不多。
dijkstra+优先队列:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int INF = 1e9 + ;
struct Node {
int _node , _dis , _cost;
bool operator <(const Node &cmp) const {
if(_dis == cmp._dis)
return _cost > cmp._cost;
return _dis > cmp._dis;
}
};
struct Edge {
int to , _dis , _cost , next;
}edge[int(2e5 + )];
int dis[] , cost[] , head[] , cnt; inline void add(int u , int v , int _dis , int _cost) {
edge[cnt].next = head[u];
edge[cnt].to = v;
edge[cnt]._cost = _cost;
edge[cnt]._dis = _dis;
head[u] = cnt++;
} void dijkstra(int s) {
dis[s] = cost[s] = ;
priority_queue <Node> que;
while(!que.empty()) {
que.pop();
}
que.push(Node{s , , });
while(!que.empty()) {
Node temp = que.top();
que.pop();
int u = temp._node;
if(temp._dis > dis[u])
continue;
for(int i = head[u] ; ~i ; i = edge[i].next) {
int v = edge[i].to;
if(dis[v] > dis[u] + edge[i]._dis) {
dis[v] = dis[u] + edge[i]._dis;
cost[v] = cost[u] + edge[i]._cost;
que.push(Node{v , dis[v] , cost[v]});
}
else if(dis[v] == dis[u] + edge[i]._dis && cost[v] > cost[u] + edge[i]._cost) {
cost[v] = cost[u] + edge[i]._cost;
que.push(Node{v , dis[v] , cost[v]});
}
}
}
} int main()
{
int n , m , u , v , d , c;
while(~scanf("%d %d" , &n , &m) && (n || m)) {
for(int i = ; i <= n ; ++i)
cost[i] = dis[i] = INF;
memset(head , - , sizeof(head));
cnt = ;
while(m--) {
scanf("%d %d %d %d" , &u , &v , &d , &c);
add(u , v , d , c);
add(v , u , d , c);
}
scanf("%d %d" , &u , &v);
dijkstra(u);
printf("%d %d\n" , dis[v] , cost[v]);
}
return ;
}
spfa:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int INF = 1e9 + ;
typedef pair <int , pair<int , int> > P; //邻接点 长度 花费
int dis[] , cost[];
vector <P> G[];
void spfa(int s) {
dis[s] = cost[s] = ;
queue <int> que;
while(!que.empty()) {
que.pop();
}
que.push(s);
while(!que.empty()) {
int node = que.front();
que.pop();
for(int i = ; i < G[node].size() ; ++i) {
int temp = G[node][i].first;
if(dis[temp] > dis[node] + G[node][i].second.first) {
dis[temp] = dis[node] + G[node][i].second.first;
cost[temp] = cost[node] + G[node][i].second.second;
que.push(temp);
}
else if(dis[temp] == dis[node] + G[node][i].second.first && cost[temp] > cost[node] + G[node][i].second.second) {
cost[temp] = cost[node] + G[node][i].second.second;
que.push(temp);
}
}
}
} int main()
{
int n , m , u , v , d , c;
while(~scanf("%d %d" , &n , &m) && (n || m)) {
for(int i = ; i <= n ; ++i) {
dis[i] = cost[i] = INF;
G[i].clear();
for(int j = i + ; j <= n ; ++j)
to[i][j] = to[j][i] = INF;
}
for(int i = ; i < m ; ++i) {
scanf("%d %d %d %d" , &u , &v , &d , &c);
G[u].push_back(P(v , make_pair(d , c)));
G[v].push_back(P(u , make_pair(d , c)));
}
scanf("%d %d" , &u , &v);
spfa(u);
printf("%d %d\n" , dis[v] , cost[v]);
}
return ;
}
HDU 3790 最短路径问题 (最短路)的更多相关文章
- HDU 3790最短路径问题 [最短路最小花费]
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) ...
- 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 3790 最短路径问题(两个限制条件的最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...
- HDU 3790 最短路径问题 (最短路)
题目链接 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. ...
- hdu 3790 最短路径问题(最短路,Dijsktra)
题目 Dijsktra基础题,只是多了一个花费,稍稍变动处理就好 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include&l ...
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...
- hdu 3790 最短路径问题(迪杰斯特拉)
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 3790 最短路径问题(SPFA || Dijkstra )
题目链接 题意 : 中文题不详述. 思路 :无论是SPFA还是Dijkstra都在更新最短路的那个地方直接将花费更新了就行,还有别忘了判重边,话说因为忘了判重边WA了一次. #include < ...
随机推荐
- UVa 1220 (树的最大独立集) Party at Hali-Bula
题意: 有一棵树,选出尽可能多的节点是的两两节点不相邻,即每个节点和他的子节点只能选一个.求符合方案的最大节点数,并最优方案判断是否唯一. 分析: d(u, 0)表示以u为根的子树中,不选u节点能得到 ...
- Java知识点:instanceof关键字
介绍 格式:a instanceof B,其中a是一个variable(设a所指向的对象的类型命名为A,即A是一个type. 功能:判断A是否 is-a B. 当a=null时,始终返回false. ...
- uva 10054 The Necklac(欧拉回路)
明显的欧拉回路,把颜色作为点,建图后,做一遍欧拉回路.不过我是现学的,打印路径上纠结了一下,发现随着FindEuler()的递归调用的结束,不断把点压入栈中,从后向前打印,遇到"支路&quo ...
- [反汇编练习] 160个CrackMe之006
[反汇编练习] 160个CrackMe之006. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- dynamic_cast,const_cast,static_cast,reinterpret_cast 详解
如果直接指针直接强转,将只能访问虚函数的内容,而不能访问特定类中的特定成员或方法!!!! 强制类型转换运算符:C++有四种强制类型转换符,分别是dynamic_cast,const_cast,stat ...
- Linux常用设置
1.文件夹操作 创建-->mkdir NAME 删除-->rm NAME -i 删除前逐一询问确认 -f 直接删除,不确认 -r 将目录即以下档案逐一删除 例:删除所有C语言程序文档,删除 ...
- Data Binding(数据绑定)用户指南
1)介绍 这篇文章介绍了如何使用Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件. Data Binding库不仅灵活而且广泛兼容- 它 ...
- centos系统常用软件环境搭建
yum源制作grub常见问题:http://linux.chinaunix.net/techdoc/beginner/2008/01/04/975921.shtml 系统安装: 2 软件安装:yum ...
- JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...
- android左右滑动加载分页以及动态加载数据
android UI 往右滑动,滑动到最后一页就自动加载数据并显示 如图: package cn.anycall.ju; import java.util.ArrayList; import java ...