poj2449 Remmarguts' Date
求第K短路
采用A*算法即可。
具体来说,书上讲的很详细,我就不写了......
本题有一个坑点:s == t 时,长度为0的那条路径不算...
我们可以把有向边建两条,便于跑第一次的单源最短路径。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 const int M = 100010, N = 1010; 5 6 inline void read(int &x) { 7 x = 0; 8 char c = getchar(); 9 while(c < '0' || c > '9') { 10 c = getchar(); 11 } 12 while(c >= '0' && c <= '9') { 13 x = (x << 3) + (x << 1) + c - 48; 14 c = getchar(); 15 } 16 return; 17 } 18 19 struct Edge { 20 int v, nex, len; 21 bool use; 22 }edge[M << 1]; int top; 23 24 struct Sta { 25 int p, val, td; 26 Sta(int position, int value, int true_distance) { 27 p = position; 28 val = value; 29 td = true_distance; 30 } 31 inline bool operator <(const Sta &x) const { 32 return val > x.val; 33 } 34 }; 35 36 int e[N], f[N], vis[N]; 37 38 inline void add(int x, int y, int z) { 39 top++; 40 edge[top].v = y; 41 edge[top].len = z; 42 edge[top].use = 1; 43 edge[top].nex = e[x]; 44 e[x] = top++; 45 edge[top].v = x; 46 edge[top].len = z; 47 edge[top].use = 0; 48 edge[top].nex = e[y]; 49 e[y] = top; 50 return; 51 } 52 53 inline void getF(int s) { 54 memset(f, 0x3f, sizeof(f)); 55 f[s] = 0; 56 std::priority_queue<Sta> Q; 57 Q.push(Sta(s, 0, 0)); 58 while(!Q.empty()) { 59 Sta t = Q.top(); 60 Q.pop(); 61 while(!Q.empty() && (vis[t.p] || f[t.p] != t.val)) { 62 t = Q.top(); 63 Q.pop(); 64 } 65 if(vis[t.p] || f[t.p] != t.val) { 66 break; 67 } 68 int x = t.p; 69 vis[x] = 1; 70 for(int i = e[x]; i; i = edge[i].nex) { 71 int y = edge[i].v; 72 if(vis[y] || edge[i].use) { 73 continue; 74 } 75 if(f[y] > f[x] + edge[i].len) { 76 f[y] = f[x] + edge[i].len; 77 Q.push(Sta(y, f[y], 0)); 78 } 79 } 80 } 81 return; 82 } 83 int cnt[N]; 84 inline int getKth(int S, int T, int K) { 85 memset(vis, 0, sizeof(vis)); 86 std::priority_queue<Sta> Q; 87 Q.push(Sta(S, f[S], 0)); 88 while(!Q.empty()) { 89 Sta t = Q.top(); 90 Q.pop(); 91 int x = t.p; 92 vis[x]++; 93 if(vis[x] > K) { 94 continue; 95 } 96 if(x == T && vis[x] == K) { 97 return t.val; 98 } 99 for(int i = e[x]; i; i = edge[i].nex) { 100 if(!edge[i].use) { 101 continue; 102 } 103 int y = edge[i].v; 104 Q.push(Sta(y, t.td + edge[i].len + f[y], t.td + edge[i].len)); 105 } 106 } 107 return -1; 108 } 109 110 int main() { 111 int m, n; 112 read(n); 113 read(m); 114 int x, y, z; 115 for(int i = 1; i <= m; i++) { 116 read(x); 117 read(y); 118 read(z); 119 add(x, y, z); 120 } 121 int s, t, k; 122 read(s); 123 read(t); 124 read(k); 125 getF(t); 126 if(s == t) { 127 k++; 128 } 129 printf("%d", getKth(s, t, k)); 130 return 0; 131 }