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 }
模板在此

 

posted @ 2018-08-14 23:37  garage  阅读(134)  评论(0编辑  收藏  举报