HNU 11072 && PKU 3635 Full Tank?
优先队列广搜求最短路
Code for HNU 11072
1 /*
2 * File: PKU 3635 Full Tank?
3 * Author: xiaotian @ hnu
4 * Created on 2010年10月8日, 下午4:27
5 * 题解:优先队列bfs
6 */
7 #include<iostream>
8 #include<math.h>
9 #include<queue>
10 #include<stdio.h>
11 #include<algorithm>
12 #include<string.h>
13 #include<vector>
14 using namespace std;
15 #define N 1008
16 #define inf 0x7fffffff
17 struct node {
18 int v, dist;
19 node(int a = 0, int b = 0) : v(a), dist(b) {
20 }
21 };
22 struct Node {
23 int v,rest,cost;
24 Node(int a = 0, int b = 0, int c = 0) : v(a), rest(b), cost(c) {
25 }
26 bool operator<(const Node &r) const{
27 return r.cost < cost;
28 }
29 };
30 vector<node>g[N];
31 int dp[N][102];
32 bool vist[N][102];
33 int n, m, a[N], V, S, T, ans;
34 priority_queue<Node>q;
35 int bfs() {
36 int x, y, z;
37 while (!q.empty())
38 q.pop();
39 q.push(Node(S, 0, 0));
40 dp[S][0] = 0;
41 while (!q.empty()) {
42 Node p = q.top();
43 q.pop();
44 x = p.v, y = p.rest, z = p.cost;
45 vist[x][y] = 1;
46 if (x == T) return z;
47 if (y + 1 <= V && !vist[x][y + 1] && dp[x][y + 1] > dp[x][y] + a[x]) {
48 dp[x][y + 1] = dp[x][y] + a[x];
49 q.push(Node(x, y + 1, dp[x][y + 1]));
50 }
51 for (int i = 0; i < g[x].size(); i++) {
52 int t = g[x][i].v;
53 int k = y - g[x][i].dist;
54 if (k >= 0 && !vist[t][k] && z < dp[t][k]) {
55 dp[t][k] = z;
56 q.push(Node(t, k, dp[t][k]));
57 }
58 }
59 }
60 return -1;
61 }
62 int main() {
63 int i, j;
64 while (scanf("%d%d", &n, &m) != EOF) {
65 for (i = 0; i < n; i++) {
66 scanf("%d", &a[i]);
67 g[i].clear();
68 }
69 int u, v, w;
70 for (i = 0; i < m; i++) {
71 scanf("%d%d%d", &u, &v, &w);
72 g[u].push_back(node(v, w));
73 g[v].push_back(node(u, w));
74 }
75 int tc;
76 scanf("%d", &tc);
77 while (tc--) {
78 scanf("%d%d%d", &V, &S, &T);
79 memset(vist, 0, sizeof (vist));
80 for (i = 0; i < n; i++)
81 for (j = 0; j <= 100; j++)
82 dp[i][j] = inf;
83 ans = bfs();
84 if (ans == -1)
85 printf("impossible\n");
86 else
87 printf("%d\n", ans);
88 }
89 }
90 return 0;
91 }
92


浙公网安备 33010602011771号