首页 > 代码库 > BZOJ1681 [Usaco2005 Mar]Checking an Alibi 不在场的证明

BZOJ1681 [Usaco2005 Mar]Checking an Alibi 不在场的证明

据说标题长可以吸引人们的注意←_←

大家都用spaf。。。不怕被卡吗?

改进的堆优化Dijkstra新鲜出炉了!!!这个板子终于改的既好看又实用了。

 

 1 /************************************************************** 2     Problem: 1681 3     User: rausen 4     Language: C++ 5     Result: Accepted 6     Time:8 ms 7     Memory:872 kb 8 ****************************************************************/ 9  10 #include <cstdio>11 #include <cstring>12 #include <algorithm>13 #include <queue>14  15 using namespace std;16 struct edges{17     int next, to, v;18 } e[2500];19  20 struct heap_node{21     int v, to;22 } NODE;23 inline bool operator < (const heap_node &a, const heap_node &b){24     return a.v > b.v;25 }26  27 priority_queue <heap_node> h;28 int X, Y, Z, F, P, C, time;29 int first[505], tot, d[505];30 int ans[105], cnt;31  32 inline int read(){33     int x = 0, sgn = 1;34     char ch = getchar();35     while (ch < 0 || ch > 9){36         if (ch == -) sgn = -1;37         ch = getchar();38     }39     while (ch >= 0 && ch <= 9){40         x = x * 10 + ch - 0;41         ch = getchar();42     }43     return sgn * x;44 }45  46 inline void add_edge(int X, int Y, int Z){47     e[++tot].next = first[X], first[X] = tot;48     e[tot].to = Y, e[tot].v = Z;49 }50  51 void add_Edges(int x, int y, int z){52     add_edge(x, y, z);53     add_edge(y, x, z);54 }55  56 inline void add_to_heap(const int p){57     for (int x = first[p]; x; x = e[x].next)58         if (d[e[x].to] == -1){59             NODE.v = e[x].v + d[p], NODE.to = e[x].to;60             h.push(NODE);61         }62 }63  64 void Dijkstra(int S){65     memset(d, -1, sizeof(d));66     while (!h.empty()) h.pop();67     d[S] = 0, add_to_heap(S);68     int p;69     while (!h.empty()){70         if (d[h.top().to] != -1){71             h.pop();72             continue;73         }74         p = h.top().to;75         d[p] = h.top().v;76         h.pop();77         add_to_heap(p);78     }79 }80  81 int main(){82     F = read(), P = read(), C = read(), time = read();83     for (int i = 1; i <= P; ++i){84         X = read(), Y = read(), Z = read();85         add_Edges(X, Y, Z);86     }87      88     Dijkstra(1);89     for (int i = 1; i <= C; ++i){90         X = read();91         if (d[X] != -1 && d[X] <= time)92             ans[++cnt] = i;93     }94     printf("%d\n", cnt);95     for (int i = 1; i <= cnt; ++i)96         printf("%d\n", ans[i]);97     return 0;98 }
View Code

 

BZOJ1681 [Usaco2005 Mar]Checking an Alibi 不在场的证明