Poj 1724 ROADS (搜索 最短路 BFS优先队列)

短命女 2023-01-06 11:55 241阅读 0赞

题意:有n 城市,r条路,有k这么多的钱。每条路都有长度和花费两个参数,求从1到n最短且总花费不超过k的长度。

思路:优先队列。每次将长度最小的出队,然后判断花费,位超限就将后继点入队。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. using namespace std;
  5. int n,k,r,e;
  6. int head[105];
  7. struct Edges
  8. {
  9. int v,c,l,next;
  10. }edge[10005];
  11. struct Node
  12. {
  13. int u,cost,len;
  14. Node (int _u,int _c, int _l)
  15. {
  16. u=_u,cost=_c,len=_l;
  17. }
  18. bool operator < (const Node& b) const
  19. {
  20. return len>b.len;
  21. }
  22. };
  23. void Addedge (int u, int v, int len, int cost)
  24. {
  25. edge[e].next = head[u];
  26. edge[e].v = v;
  27. edge[e].l = len;
  28. edge[e].c = cost;
  29. head[u] = e++;
  30. }
  31. int Deal ()
  32. {
  33. priority_queue<Node> q;
  34. q.push(Node(1,0,0));
  35. while (!q.empty())
  36. {
  37. Node temp = q.top();
  38. q.pop();
  39. if (temp.u == n)
  40. return temp.len;
  41. for (int i=head[temp.u];i != -1; i=edge[i].next)
  42. if (temp.cost + edge[i].c <= k)
  43. q.push (Node(edge[i].v,temp.cost+edge[i].c,temp.len+edge[i].l));
  44. }
  45. return -1;
  46. }
  47. int main ()
  48. {
  49. scanf("%d%d%d",&k,&n,&r);
  50. e=0;
  51. memset(head,-1,sizeof(head));
  52. for (int i=0; i<r;i++)
  53. {
  54. int a,b,c,d;
  55. scanf("%d%d%d%d",&a,&b,&c,&d);
  56. Addedge(a,b,c,d);
  57. }
  58. printf("%d\n",Deal ());
  59. return 0;
  60. }

发表评论

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

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

相关阅读

    相关 BFS(广度优先搜索)

    广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。如果所有节点均被访问,则

    相关 BFS广度优先搜索

    BFS(Breadth-First Search),广度优先搜索,又称宽度优先搜索。 目的 从某个状态出发,彻底地遍历所有可以到达的状态。 设s为初始状态,先搜索与

    相关 广度优先搜索BFS

    BFS是一种图搜索算法,当然这种思想也可以被借鉴到各种其他的算法中。 对于图中的所有节点,我们选一个起始点s, 然后去发现(遍历)所有从s 点出发能直接到达的点, 为了记