最短路径问题

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

Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
 
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
 
Output
输出 一行有两个数, 最短距离及其花费。
 
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
 
Sample Output
9 11
 
Source
 
Recommend
notonlysuccess   |   We have carefully selected several similar problems for you:  1874 2066 1217 2112 1142
 
傻X了,在比较花费大小时,写成了p[e.to] = min(p[e.to],p[v]+e.cost) 实际上花费是附属于最短路径的,确定了路径,花费也就确定了,QAQ,搞了一中午。。。
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
struct edge{
int to,dis,cost;
};
vector<edge> g[];
typedef pair<int,int> pa; //第一元素是距离,第二元素是编号
int d[],p[];
int s,t;
void dijkstra(){
memset(d,INF,sizeof(d));
memset(p,INF,sizeof(p));
d[s] = ;
p[s] = ;
priority_queue< pa, vector<pa>, greater<pa> > q;
q.push(pa(,s));
while(!q.empty()){
pa cur = q.top(); q.pop();
int v = cur.second;
if(d[v]<cur.first) continue;
for(int i = ; i<g[v].size(); i++){
edge e = g[v][i];
if(d[e.to] >= d[v]+e.dis){
d[e.to] = d[v]+e.dis;
p[e.to] = p[v]+e.cost;
q.push(pa(d[e.to],e.to));
}
}
}
}
void solve(){
int n,m;
while(scanf("%d%d",&n,&m) == && n && m){
for(int i = ; i<m; i++){
int a,b,c,p;
scanf("%d%d%d%d",&a,&b,&c,&p);
g[a].push_back((edge){b,c,p});
g[b].push_back((edge){a,c,p});
}
scanf("%d%d",&s,&t);
dijkstra();
printf("%d %d\n",d[t],p[t]);
for(int i = ; i<; i++) g[i].clear();
}
}
int main(){
solve();
}

第两种写法:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
struct edge{
int to,dis,cost;
friend bool operator < (edge A,edge B){
if(A.dis!=B.dis) return A.dis>B.dis;
else return A.cost>B.cost;
}
};
vector<edge> g[];
//typedef pair<int,int> pa; //第一元素是距离,第二元素是编号
int d[],p[];
bool done[];
int s,t;
void dijkstra(){
memset(d,INF,sizeof(d));
memset(p,INF,sizeof(p));
memset(done,false,sizeof(done));
d[s] = ;
p[s] = ;
priority_queue<edge> q;
q.push((edge){s,,});
while(!q.empty()){
edge cur = q.top(); q.pop();
int v = cur.to;
if(done[v]) continue;
done[v] = true;
for(int i = ; i<g[v].size(); i++){
edge e = g[v][i];
if((d[e.to] > d[v]+e.dis)||(d[e.to] == d[v]+e.dis&&p[e.to]>p[v]+e.cost)){
d[e.to] = d[v]+e.dis;
p[e.to] = p[v]+e.cost;
q.push((edge){e.to,d[e.to],p[e.to]});
}
}
}
}
void solve(){
int n,m;
while(scanf("%d%d",&n,&m) == && n && m){
for(int i = ; i<m; i++){
int a,b,c,p;
scanf("%d%d%d%d",&a,&b,&c,&p);
g[a].push_back((edge){b,c,p});
g[b].push_back((edge){a,c,p});
}
scanf("%d%d",&s,&t);
dijkstra();
printf("%d %d\n",d[t],p[t]);
for(int i = ; i<; i++) g[i].clear();
}
}
int main(){
solve();
}

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

  1. 最短路径问题 HDU - 3790 (Dijkstra算法 + 双重权值)

    参考:https://www.cnblogs.com/qiufeihai/archive/2012/03/15/2398455.html 最短路径问题 Time Limit: 2000/1000 MS ...

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

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

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

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

  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)

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

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

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

随机推荐

  1. 获取输入设备的vid和pid

    一.获取/dev/input/event16设备的vid和pid testhid.c #include <linux/types.h> #include <linux/input.h ...

  2. NSTimer定时器

    NSTimer的避免内存泄露与控制器的正确引用和释放:

  3. C#生成随机汉字

    using System; using System.Text; namespace ConsoleApplication {     class ChineseCode     {          ...

  4. javascript IP验证

    //IP验证function isIP(strIP){try{if(strIP.length<7){return false;}var re=/^(\d+)\.(\d+)\.(\d+)\.(\d ...

  5. (转)Tomcat内存设置详解

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出JVM在启 ...

  6. 01_change_schema.sql

    set echo on feedback on spool ./log/01_change_schema.log -- -- schema change to v_idocdata_un -- -- ...

  7. hibernate缓存机制(二级缓存)

    一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...

  8. C++矩阵处理库--Eigen初步使用

      项目要进行比较多的矩阵操作,特别是二维矩阵.刚开始做实验时,使用了动态二维数组,于是写了一堆Matrix函数,作矩阵的乘除加减求逆求行列式.实验做完了,开始做代码优化,发现Matrix.h文件里适 ...

  9. F(k)<(维护+枚举)\(找规律+递推+枚举)>

    题意 小明有一个不降序列(f(1),f(2),f(3),--),f(k)代表在这个序列中大小是k的有f(k)个.我们规定f(n)的前12项如下图. n 1 2 3 4 5 6 7 8 9 10 11 ...

  10. Git本地项目上传 & SourceTree & GitHub 简单使用

    Git(分布式版本控制系统) Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理 ...