题干:

给你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

解题报告:

最短路的双权值问题,优先级高的满足小于关系的时候,对于优先级低的需要无脑加,当优先级高的相等的时候优先级较低的才可以取min  。

AC代码:

#include<bits/stdc++.h>using namespace std;
const int MAX = 1000 + 5;
const int INF = 0x3f3f3f3f;
int cost[MAX],dis[MAX];
bool vis[MAX];
int head[MAX];
int n,m;
int cnt;
int st,ed;
//w代表距离,c代表花费
struct Edge {int to,w,ne,c;
} e[100000 + 5];
struct Point {int pos;int w,c;Point(){}Point(int pos,int w,int c):pos(pos),w(w),c(c){}bool operator<(const Point & b) const {return w>b.w;}
} p;
void Dijkstra(int u,int v) {dis[u] = 0;cost[u] = 0;int all = n,minw = INF,minv;priority_queue<Point> pq;pq.push(Point(u,0,0));while(!pq.empty()) {
//      printf("...\n");Point cur = pq.top();pq.pop();
//      if(vis[cur.pos] == 1) continue;//加不加都可以 vis[cur.pos] = 1;if(cur.pos == v) break;int x = cur.pos;for(int i = head[x]; i!=-1; i=e[i].ne) {
//          if(vis[e[i].to] == 1) continue;  这句千万不能加。。。 if(dis[e[i].to] > dis[x] + e[i].w ) {dis[e[i].to] = dis[x] + e[i].w;cost[e[i].to] = cost[x] + e[i].c;pq.push(Point(e[i].to,dis[e[i].to],cost[e[i].to]));}else if(dis[e[i].to] == dis[x] + e[i].w) {cost[e[i].to] = min(cost[e[i].to] , cost[x] + e[i].c);pq.push(Point(e[i].to,dis[e[i].to],cost[e[i].to]));}
//          if(vis[e[i].to ] == 0)
//          pq.push(Point(e[i].to,dis[e[i].to],cost[e[i].to]));             }}printf("%d %d\n",dis[v],cost[v]);
} void add(int a,int b,int w,int c) {e[cnt].to = b;e[cnt].w = w;e[cnt].c = c; e[cnt].ne = head[a];head[a] = cnt++;
}
void init() {cnt = 0;memset(head,-1,sizeof(head));memset(dis,INF,sizeof(dis));memset(cost,INF,sizeof(cost));memset(vis,0,sizeof(vis));
}
int main()
{int a,b,d,p;while(~scanf("%d%d",&n,&m)) {if(n == 0 && m == 0) break;init();while(m--) {scanf("%d%d%d%d",&a,&b,&d,&p);add(a,b,d,p);add(b,a,d,p);}scanf("%d%d",&st,&ed);Dijkstra(st,ed); }return 0 ;
}

MLE代码:(就是push的位置不同,,就会MLE)

//改一下push的位置  能过吗?
#include<bits/stdc++.h>using namespace std;
const int MAX = 1000 + 5;
const int INF = 0x3f3f3f3f;
int cost[MAX],dis[MAX];
bool vis[MAX];
int head[MAX];
int n,m;
int cnt;
int st,ed;
//w代表距离,c代表花费
struct Edge {int to,w,ne,c;
} e[100000 + 5];
struct Point {int pos;int w,c;Point(){}Point(int pos,int w,int c):pos(pos),w(w),c(c){}bool operator<(const Point & b) const {return w>b.w;}
} p;
void Dijkstra(int u,int v) {dis[u] = 0;cost[u] = 0;int all = n,minw = INF,minv;priority_queue<Point> pq;pq.push(Point(u,0,0));while(!pq.empty()) {
//      printf("...\n");Point cur = pq.top();pq.pop();
//      if(vis[cur.pos] == 1) continue;//加不加都可以 vis[cur.pos] = 1;if(cur.pos == v) break;int x = cur.pos;for(int i = head[x]; i!=-1; i=e[i].ne) {
//          if(vis[e[i].to] == 1) continue;  这句千万不能加。。。 if(dis[e[i].to] > dis[x] + e[i].w ) {dis[e[i].to] = dis[x] + e[i].w;cost[e[i].to] = cost[x] + e[i].c;
//              pq.push(Point(e[i].to,dis[e[i].to],cost[e[i].to]));}else if(dis[e[i].to] == dis[x] + e[i].w) {cost[e[i].to] = min(cost[e[i].to] , cost[x] + e[i].c);
//              pq.push(Point(e[i].to,dis[e[i].to],cost[e[i].to]));}if(vis[e[i].to ] == 0) pq.push(Point(e[i].to,dis[e[i].to],cost[e[i].to]));                }}printf("%d %d\n",dis[v],cost[v]);
} void add(int a,int b,int w,int c) {e[cnt].to = b;e[cnt].w = w;e[cnt].c = c; e[cnt].ne = head[a];head[a] = cnt++;
}
void init() {cnt = 0;memset(head,-1,sizeof(head));memset(dis,INF,sizeof(dis));memset(cost,INF,sizeof(cost));memset(vis,0,sizeof(vis));
}
int main()
{int a,b,d,p;while(~scanf("%d%d",&n,&m)) {if(n == 0 && m == 0) break;init();while(m--) {scanf("%d%d%d%d",&a,&b,&d,&p);add(a,b,d,p);add(b,a,d,p);}scanf("%d%d",&st,&ed);Dijkstra(st,ed); }return 0 ;
}

【HDU - 3790】最短路径问题(DIjkstra算法 双权值)相关推荐

  1. hdu 3790(最短路径问题 SPFA算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    ...

  2. (dijkstra算法+多权值)最短路径问题

    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input 输入n,m,点的编号是1~n,然后是m ...

  3. Dijkstra算法为什么权值不能是负值

    Dijkstra算法当中将节点分为已求得最短路径的集合(记为S)和未确定最短路径的个集合(记为U), 归入S集合的节点的最短路径及其长度不再变更,如果边上的权值允许为负值,那么有可能出现当与S 内某点 ...

  4. HDU 3790 最短路径问题 (dijkstra)

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

  5. 【PAT - 甲级1003】Emergency (25分)(Dijkstra,最短路条数,双权值最短路)

    题干: As an emergency rescue team leader of a city, you are given a special map of your country. The m ...

  6. PTA 7-3 旅游规划 (25分)(双权值Dijkstra最短路)

    7-3 旅游规划 (25分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路 ...

  7. 最短路径的Dijkstra算法(邻接表)

    原文:http://blog.csdn.net/axiqia/article/details/50984464 描述 以邻接表作为存储结构实现,求解从给定源点到给定结束点的最短路径. 输入 从1开始表 ...

  8. 图的单源最短路径:Dijkstra算法实现

    本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法 ...

  9. 数据结构——最短路径之Dijkstra算法(与最小生成树的prime算法很像,建议一起看)

    最短路径之Dijkstra算法 (一)Dijkstra算法 单源最短路径:就是从某一个顶点出发,到图中任意顶点之间的最短路径: [算法概述]:Dijkstra算法适用于解决单源最短路径的问题.即:从源 ...

最新文章

  1. C++实现遍历链表一次求出中间的节点
  2. mysql 员工工资上涨5%_工资从1万到3万,你还差mysql数据库优化之系列五
  3. (九)React面试真题演练
  4. 2016 Top 10 Android Library
  5. caioj1522: [NOIP提高组2005]过河
  6. 容器服务Windows Kubernetes使用阿里云日志服务来收集容器日志
  7. iOS活动倒计时的两种实现方式
  8. 2.3.14 Python 函数进阶-生成器
  9. Mac上使用CleanMyMac彻底擦除文件详细教程
  10. Java开发笔记(一百二十九)Swing的输入框
  11. 数据结构视频教程哪个好
  12. 数据中心智能综合监控系统
  13. java就业感言_JAVA就业班感言
  14. numpy中按条件查找,搜索某些值的方法
  15. 软件开发模式:瀑布与敏捷应用思考
  16. Java压缩图片大小
  17. win 10计算机文件,Win10电脑怎么转移c盘文件?
  18. 关于数字化转型方法论的一些思考
  19. 适合穷人挣钱最快的方法
  20. ruby 数组自定义排序_在Ruby中对数组排序

热门文章

  1. svm解决兵王问题_机器学习: svm
  2. python私有属性怎么定义_Python中定义私有属性的方法是()。
  3. js 获取域名_RapidDNS域名查询如何联动Goby
  4. 【Modern OpenGL】第一个三角形
  5. 取消一个请求(Cancel)
  6. WINCE Driver 心得总结
  7. php hasmany,浅谈laravel orm 中的一对多关系 hasMany
  8. maple 2018 窗口关闭提示乱码_如果解决SOLIDWORKS工程图转CAD字体出现乱码的问题_SolidWorks生信科技...
  9. arcgis判断两个字段是否相等
  10. 【转】2.1(译)关于async与await的FAQ