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 < ...
随机推荐
- MySQL学习笔记二
Ø function 函数 函数的作用比较大,一般多用在select查询语句和where条件语句之后.按照函数返回的结果, 可以分为:多行函数和单行函数:所谓的单行函数就是将每条数据进行独立的计算,然 ...
- EXT 数据按F12,F11 显示问题
最近做关于EXT的项目,因为是刚开始接触EXT,对什么都不熟悉,所以把其他人写好的浏览页代码考过了来,换成自己需要的. 一切都做好了,然后数据不出来,就调试看,后台也出现数据了,然后就按F12调试前台 ...
- CodeForces 489B (贪心 或 最大匹配) BerSU Ball
题意: 有m个男孩和n个女孩,每个人都有一个舞蹈熟练度,用一个不超过100的正整数来表示. 一个男孩和一个女孩能够结为舞伴当且仅当两人的熟练度相差不超过1. 问最多能结成多少对舞伴 分析: 这是一个二 ...
- Android自定义的webView——可实现的网页文本的复制
package com.example.customlinearlayout.view; import android.app.ProgressDialog; import android.conte ...
- 【转】linux : waitpid函数
原文网址:http://blog.csdn.net/jifengszf/article/details/3067841 [waitpid系统调用] 功能描述: 等待进程改变其状态.所有下面 ...
- Oracle 课程八之性能优化之10046事件
Oracle 的事件很多. 具体参考blog: Oracle 跟踪事件 set event 转摘:http://blog.csdn.net/tianlesoftware/archive/2009/12 ...
- [SharePoint 2010]关于基于声明(Claims)的用户认证模式
转:http://blog.csdn.net/zw_2011/article/details/7417132 SharePoint 2010在用户认证模式上,较之以前的版本有了非常大的改变.在Shar ...
- linux 命令——文件管理 cat
一.介绍 cat 是一个文本文件查看和连接工具.从第一个字节开始正向查看文件的内容. 主要有三大功能: 1.一次显示整个文件.$ cat filename ~,y6;e2.从键盘创建一个文件.$ ...
- hdu 2087-剪花布条(KMP)
题意: 求文本串最多可以分成几个模式串. 分析: KMP #include <map> #include <set> #include <list> #includ ...
- Oracle11g导入*.dmp数据文件
imp命令导入数据:imp username/password@SID file=XXX.dmp fromuser=XXX touser=XXX tables=(XXX,XXX) [ignore=y ...