首页 > 代码库 > 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 }
BZOJ1681 [Usaco2005 Mar]Checking an Alibi 不在场的证明
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。