K短路 dij + Astar。
/*Accepted 9904K 282MS C++ 2223B 2012-09-28 15:30:02*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> #include <queue> using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 1 << 10; const int MAXM = 100 * MAXN; typedef pair<int, int> pii; struct edge { int next, v, w; }e[MAXM << 1]; int es, es2, f1[MAXN], f2[MAXN]; int n, m, S, T, K; int cal[MAXN], d[MAXN]; void addedge(int u, int v, int w) { e[es].v = v, e[es].w = w; e[es].next = f1[u], f1[u] = es ++; e[es2].v = u, e[es2].w = w; e[es2].next = f2[v], f2[v] = es2 ++; } void ReadGraph() { memset(f1, -1, sizeof f1); memset(f2, -1, sizeof f2); es = 0, es2 = m; for(int i = 0; i < m; i ++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); addedge(u, v, w); } scanf("%d%d%d", &S, &T, &K); if(S == T) K ++; } priority_queue<pii, vector<pii>, greater<pii> > q; void dijkstra(int s, int totn) { for(int i = 1; i <= totn; i ++) { d[i] = (i == s ? 0 : INF); cal[i] = 0; } q.push(make_pair(0, s)); while(!q.empty()) { pii p = q.top(); q.pop(); int u = p.second; if(cal[u]) continue; cal[u] = 1; for(int i = f2[u]; i != -1; i = e[i].next) { int v = e[i].v; if(d[v] > d[u] + e[i].w) { d[v] = d[u] + e[i].w; q.push(make_pair(d[v], v)); } } } } int Kth_Astar(int s, int t, int k) { if(d[s] == INF) return -1; q.push(make_pair(d[s], s)); memset(cal, 0, sizeof cal); while(!q.empty()) { pii p = q.top(); q.pop(); int u = p.second; cal[u] ++; if(cal[u] > k) continue; if(cal[t] == k) return p.first; for(int i = f1[u]; i != -1; i = e[i].next) { int v = e[i].v; q.push(make_pair(p.first - d[u] + e[i].w + d[v], v)); } } return -1; } int main() { while(scanf("%d%d", &n, &m) != EOF) { ReadGraph(); dijkstra(T, n); printf("%d\n", Kth_Astar(S, T, K)); } return 0; }
浙公网安备 33010602011771号