[关闭]
@Chilling 2017-02-16T17:56:08.000000Z 字数 2070 阅读 1044

HDU-3790: 最短路径问题

最短路


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

Output
输出 一行有两个数, 最短距离及其花费。

Sample Input

3 2
1 2 5 6
2 3 4 5
1 3
0 0

Sample Output

9 11

注意的地方:题意是说,首先要保证路径最短,然后在保证路径最短的情况下保证花费最少。不要理解错题目的意思了。

  1. friend bool operator <(node x,node y) //结构体重载
  2. {
  3. if(x.len==y.len)
  4. return x.val>y.val;
  5. return x.len>y.len;
  6. }
  1. if(dis[next.en]>now.len+next.len)
  2. {
  3. dis[next.en]=now.len+next.len;
  4. pay[next.en]=now.val+next.val;
  5. q.push(node(next.en,dis[next.en],pay[next.en])); //注意这里是dis[next.en]和pay[next.en] 最开始写错了……半天找不到问题
  6. }
  7. else if(dis[next.en]==now.len+next.len)
  8. {
  9. if(pay[next.en]>now.val+next.val)
  10. {
  11. pay[next.en]=now.val+next.val;
  12. q.push(node(next.en,dis[next.en],pay[next.en]));
  13. }
  14. }
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<queue>
  4. #include<string.h>
  5. using namespace std;
  6. int n,m,vis[1111],dis[1111],pay[1111];
  7. struct node
  8. {
  9. int en,len,val;
  10. node(int en1=0,int len1=0,int val1=0)
  11. {
  12. en=en1;len=len1;val=val1;
  13. }
  14. friend bool operator <(node x,node y)
  15. {
  16. if(x.len==y.len)
  17. return x.val>y.val;
  18. return x.len>y.len;
  19. }
  20. };
  21. vector<node> v[1111];
  22. void dij(int st)
  23. {
  24. dis[st]=0;
  25. pay[st]=0;
  26. priority_queue<node>q;
  27. q.push(node(st,dis[st],pay[st]));
  28. while(!q.empty())
  29. {
  30. node now,next;
  31. now=q.top();
  32. q.pop();
  33. if(vis[now.en]==1)
  34. continue;
  35. vis[now.en]=1;
  36. for(int i=0;i<v[now.en].size();i++)
  37. {
  38. next=v[now.en][i];
  39. if(dis[next.en]>now.len+next.len)
  40. {
  41. dis[next.en]=now.len+next.len;
  42. pay[next.en]=now.val+next.val;
  43. q.push(node(next.en,dis[next.en],pay[next.en]));
  44. }
  45. else if(dis[next.en]==now.len+next.len)
  46. {
  47. if(pay[next.en]>now.val+next.val)
  48. {
  49. pay[next.en]=now.val+next.val;
  50. q.push(node(next.en,dis[next.en],pay[next.en]));
  51. }
  52. }
  53. }
  54. }
  55. }
  56. int main()
  57. {
  58. int a,b,d,p,st,en;
  59. while(scanf("%d%d",&n,&m),m+n)
  60. {
  61. memset(vis,0,sizeof(vis));
  62. memset(dis,127,sizeof(dis));
  63. memset(pay,127,sizeof(pay));
  64. for(int i=0;i<=n;i++)
  65. v[i].clear();
  66. while(m--)
  67. {
  68. scanf("%d%d%d%d",&a,&b,&d,&p);
  69. v[a].push_back(node(b,d,p));
  70. v[b].push_back(node(a,d,p));
  71. }
  72. scanf("%d%d",&st,&en);
  73. dij(st);
  74. printf("%d %d\n",dis[en],pay[en]);
  75. }
  76. return 0;
  77. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注