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
 
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<queue>
  4. using namespace std;
  5.  
  6. typedef struct n1
  7. {
  8. int x,dist,mony;
  9. friend bool operator<(n1 a,n1 b)
  10. {
  11. if(b.dist>a.dist)
  12. return b.dist<a.dist;
  13. else if(b.dist==a.dist&&b.mony>=a.mony)
  14. return b.mony<a.mony;
  15. }
  16. }node;
  17. node map[1005][1005],N[1005];
  18. int s,t,min_dist,min_mony;
  19. int vist[1005][1005];
  20. void set(int n,int m)
  21. {
  22. int i,j,n1,n2,d,p;
  23. for(i=1;i<=n;i++)
  24. {
  25. for(j=1;j<=n;j++)
  26. {
  27. map[i][j].dist=0;vist[i][j]=0;
  28. }
  29. }
  30. while(m--)
  31. {
  32. scanf("%d%d%d%d",&n1,&n2,&d,&p);
  33. if(map[n1][n2].dist==d)
  34. {
  35. if(map[n1][n2].mony>p)
  36. map[n1][n2].mony=map[n2][n1].mony=p;
  37. }
  38. else if(map[n1][n2].dist==0||map[n1][n2].dist>d)
  39. {
  40. map[n1][n2].dist=map[n2][n1].dist=d;
  41. map[n1][n2].mony=map[n2][n1].mony=p;
  42. }
  43. }
  44. scanf("%d%d",&s,&t);
  45. }
  46. void BFS(int n)
  47. {
  48. priority_queue<node> Q;
  49. node q,p;
  50. int i;
  51. q.mony=0; q.dist=0;q.x=t;
  52. Q.push(q);
  53. while(!Q.empty())
  54. {
  55. q=Q.top();
  56. Q.pop();
  57. if(q.x==s)
  58. {
  59. min_dist=q.dist;min_mony=q.mony;
  60. break;
  61. }
  62. for(i=1;i<=n;i++)
  63. if(map[q.x][i].dist&&!vist[q.x][i])
  64. {
  65. vist[q.x][i]=vist[i][q.x]=1;//这样就不会走重复的路
  66. p.dist=map[q.x][i].dist+q.dist;
  67. p.mony=map[q.x][i].mony+q.mony;
  68. p.x=i;//printf("%d %d %d\n",p.x,p.dist,p.mony);
  69. Q.push(p);
  70. }
  71. }
  72. }
  73. int main()
  74. {
  75. int n,m;
  76. while(scanf("%d%d",&n,&m)>0&&(n||m))
  77. {
  78. set(n,m);
  79. BFS(n);
  80. printf("%d %d\n",min_dist,min_mony);
  81. }
  82. }

hdu3790最短路径问题 (用优先队列实现的)的更多相关文章

  1. hdu3790最短路径问题(BFS+优先队列)

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

  2. HDU-3790 最短路径问题

    最短路径问题 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

  3. hdu-3790最短路径问题

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

  4. HDU-3790最短路径问题,第十遍终于过了~

    最短路径问题                                                                   Time Limit: 2000/1000 MS (J ...

  5. hdu3790最短路径问题

    题意是这种,给你一个无向图, 每条边有距离和花费, 假设从第一个点到末点的最短路不唯一, 则输出最短路长度以及最少的花费. 否则输出长度和花费即可. 用传说中的链式向前星优化了一下边的存储, 写了个s ...

  6. hdu-3790 最短路径问题(双重权值)

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

  7. HDU-3790 最短路径问题(双重权值)

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

  8. hdu-3790 最短路径问题---dijkstra两重权值

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到 ...

  9. 最短路径-Dijkstra+Floyd+Spfa

    Dijkstra算法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra ...

随机推荐

  1. Cocos2d-x使用android拍照功能加载照片内存过大,通过另存照片尺寸大小解决

    使用2dx调用android拍照功能,拍照结束后在2dx界面显示拍照照片,如果不对照片做处理,会出现内存过大的问题,导致程序崩溃,如果仅仅另存拍照照片,则照片质量大小均下降,导致照片不够清晰,后来发现 ...

  2. Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换

    t使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec类 ...

  3. SLF4J warning or error messages and their meanings(转)

    The method o.a.commons.logging.impl.SLF4FLogFactory#release was invoked. Given the structure of the ...

  4. 基于visual Studio2013解决面试题之1007鸡蛋和篮子

     题目

  5. VC 对话框背景颜色、控件颜色

    系统环境:Windows 7软件环境:Visual C++ 2008 SP1本次目的:为对话框设置背景颜色.控件颜色 既然MFC对话框不好开发,那么现在我们来开始美化我们的对话框.为对话框设置背景颜色 ...

  6. 写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N平均分布的

    题目:有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL.现在要求写一个函数int get(),这个函数运行一次可以从V[N] ...

  7. 1.0.x-学习Opencv与MFC混合编程之---视频运动检测

    源代码地址: http://download.csdn.net/detail/nuptboyzhb/3961668 版本1.0.x新增内容 视频运动检测 Ø 新建菜单项,Learning OpenCV ...

  8. python模块介绍- HTMLParser 简单的HTML和XHTML解析器

    python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...

  9. linux中段错误的处理

    在 Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fau ...

  10. HDU 4709 Herding 几何题解

    求全部点组成的三角形最小的面积,0除外. 本题就枚举全部能够组成的三角形,然后保存最小的就是答案了.由于数据量非常少. 复习一下怎样求三角形面积.最简便的方法就是向量叉乘的知识了. 并且是二维向量叉乘 ...