标签:car alice esc ted length 优先队列 one integer named
题目链接:
https://cn.vjudge.net/problem/POJ-1724
5 6 7 1 2 2 3 2 4 3 3 3 4 2 4 1 3 4 1 4 6 2 1 3 5 2 0 5 4 3 2Sample Output
11
1 /* 2 题意描述 3 输入总钱数k,顶点数n,边数m 4 每一条边s到d长度是l,花费是t 5 可能有重边 6 问在不超过k的前提下,从1到n的最短路径是多少,如果不存在这样的最短路输出-1. 7 8 解题思路 9 使用用优先队列的广搜,保证每次弹出的结点是距离最短,而且花费相对小的,搜索的时候不用像矩阵中那样标记哪个结点用过了,因为使用 10 的是每个结点的邻接边,标记了可能就不能用这条边了,故直接搜索。还需注意的是一定要是弹出的结点是终点再结束,如果在搜索的时候遇 11 到直接结束,可能这条路径不是最短的,但是从优先队列里第一个弹出的一定是最短的。 12 */ 13 #include<cstdio> 14 #include<vector> 15 #include<queue> 16 #include<cstring> 17 const int maxn = 110; 18 const int INF = 0x3f3f3f3f; 19 using namespace std; 20 21 struct Edge{ 22 int from, to, dist, pay; 23 Edge(int s, int d, int l, int t) : from(s), to(d), dist(l), pay(t) { }; 24 }; 25 26 struct HeapNode { 27 int u, d, c; 28 bool operator < (const HeapNode& a) const { 29 if(d == a.d){ 30 return c > a.c; 31 } 32 return d > a.d; 33 } 34 }; 35 36 struct BFS { 37 int n,m; 38 vector<Edge> edges; 39 vector<int> G[maxn]; 40 bool done[maxn]; 41 42 void init(int n) { 43 this->n = n; 44 for(int i = 0; i < n; i++) 45 G[i].clear(); 46 edges.clear(); 47 } 48 49 void AddEdge(int from, int to, int dist, int pay) { 50 edges.push_back(Edge(from, to, dist, pay)); 51 m = edges.size(); 52 G[from].push_back(m - 1); 53 } 54 55 int bfs(int k, int s) { 56 memset(done, 0, sizeof(done)); 57 done[s] = 1; 58 59 priority_queue<HeapNode> q; 60 q.push((HeapNode){s, 0, 0}); 61 while(!q.empty()) { 62 HeapNode x = q.top(); 63 q.pop(); 64 int u = x.u; 65 if(u == n - 1) 66 return x.d; 67 for(int i = 0; i < G[u].size(); i++) { 68 Edge e = edges[G[u][i]]; 69 if(k >= e.pay + x.c) 70 q.push((HeapNode){e.to, x.d+e.dist, e.pay + x.c}); 71 } 72 } 73 return -1; 74 } 75 }; 76 77 struct BFS solve; 78 int main() 79 { 80 int k, n, m, s, d, l, t; 81 while(scanf("%d", &k) != EOF) { 82 scanf("%d%d", &n, &m); 83 84 solve.init(n); 85 for(int i = 1; i <= m; i++) { 86 scanf("%d%d%d%d",&s, &d, &l, &t); 87 s--;d--; 88 solve.AddEdge(s, d, l, t);//先--再使用 89 } 90 91 printf("%d\n", solve.bfs(k,0)); 92 } 93 return 0; 94 }
POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)
标签:car alice esc ted length 优先队列 one integer named
原文地址:https://www.cnblogs.com/wenzhixin/p/9383087.html