BFS,dijkstra算法

雨点打透心脏的1/2处 2022-05-25 11:11 275阅读 0赞

http://ac.jobdu.com/problem.php?pid=1008

题目描述:
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
输入:
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
输出:
输出 一行有两个数, 最短距离及其花费。
样例输入:
3 2
1 2 5 6
2 3 4 5
1 3
0 0
样例输出:

9 11

代码贡献者:http://my.csdn.net/cstur4

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <memory.h>
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <queue>
  8. #include <vector>
  9. using namespace std;
  10. #define MAX 0Xfffffff
  11. struct Node{
  12. int p, d;
  13. int th;
  14. bool operator>(const Node&node)const{
  15. if(d==node.d)
  16. return p>node.p;
  17. return d>node.d;
  18. }
  19. };
  20. bool visit[1001];
  21. int mapd[1001][1001];
  22. int mapp[1001][1001];
  23. int dis[1001];
  24. int ps[1001];
  25. priority_queue<Node, vector<Node>, greater<Node>> q; //应该使用小顶堆
  26. int main(){
  27. //freopen("in.txt", "r", stdin);
  28. int n, m;
  29. int a, b, d, p;
  30. while(cin>>n>>m, n+m){
  31. for(int i=1;i<=n;++i){
  32. visit[i] = false;
  33. dis[i] = MAX;
  34. ps[i] = MAX;
  35. for(int j=1;j<=n;++j){
  36. if(i==j){
  37. mapd[i][j] = mapp[i][j] = 0;
  38. continue;
  39. }
  40. mapd[i][j] = MAX;
  41. mapp[i][j] = MAX;
  42. }
  43. }
  44. for(int i=0;i<m;++i){
  45. scanf("%d%d%d%d", &a, &b, &d, &p);
  46. if(d<mapd[a][b]){
  47. mapd[a][b] = mapd[b][a] = d;
  48. mapp[a][b] = mapp[b][a] = p;
  49. }
  50. if(d==mapd[a][b]&&p<mapp[a][b]){
  51. mapp[a][b] = mapp[b][a] = p;
  52. }
  53. }
  54. int s, t;
  55. cin>>s>>t;
  56. Node node;
  57. node.th = s;
  58. node.d = 0;
  59. node.p = 0;
  60. q.push(node);
  61. while(!q.empty()){ //BFS, kijstra算法求最小距离,其中有dp的思想
  62. Node node = q.top();
  63. q.pop();
  64. if(visit[node.th])
  65. continue;
  66. visit[node.th] = true;
  67. for(int i=1;i<=n;++i){
  68. if(i!=node.th && mapd[node.th][i]!=MAX && visit[i]==false){
  69. if(node.d + mapd[node.th][i] < dis[i]){
  70. dis[i] = node.d + mapd[node.th][i];
  71. ps[i] = node.p + mapp[node.th][i];
  72. Node tmp;
  73. tmp.th = i;
  74. tmp.d = dis[i];
  75. tmp.p = ps[i];
  76. q.push(tmp);
  77. }else if(node.d + mapd[node.th][i] == dis[i] && node.p + mapp[node.th][i] < ps[i]){
  78. ps[i] = node.p + mapp[node.th][i];
  79. Node tmp;
  80. tmp.d = dis[i];
  81. tmp.p = ps[i];
  82. tmp.th = i;
  83. q.push(tmp);
  84. }
  85. }
  86. }
  87. }
  88. if( s==t )
  89. printf("%d %d\n", 0, 0);
  90. else
  91. printf("%d %d\n", dis[t], ps[t]);
  92. }
  93. //fclose(stdin);
  94. }

发表评论

表情:
评论列表 (有 0 条评论,275人围观)

还没有评论,来说两句吧...

相关阅读

    相关 算法-分治算法

    一、分治 1、定义:分治,也就是分而治之。 它的一般步骤是: ① 将原问题分解成若干个规模较小的子问题(子问题和原问题的结构一样,只是规模不一样)

    相关 算法-回溯算法

    一、回溯 1、定义:通过选择不同的岔路口来通往目的地(找到想要的结果) 每一步都选择一条路出发,`能进则进,不能进则退回上一步(回溯)`,换一条路再

    相关 算法】查找算法

    文章目录 二分查找并返回数据应该插入的位置 二分查找并返回数据应该插入的位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存

    相关 算法--排序算法

    首发网址:[算法--排序算法\_IT利刃出鞘的博客-CSDN博客][--_IT_-CSDN] 其他网址 [一文搞定十大经典排序算法(Java实现) - 简书][Java

    相关 算法 BF算法

    BF算法是字符匹配的一种算法,也称暴力匹配算法 算法思想: 从主串s1的pos位置出发,与子串s2第一位进行匹配 若相等,接着匹配后一位字符 若不相等,则返回到s