首页 > 代码库 > BZOJ1631 [Usaco2007 Feb]Cow Party
BZOJ1631 [Usaco2007 Feb]Cow Party
凑数用的。。。其实是刚写了个spfa的板子,感觉很好而已。。。
每个点spfa一边就过了。。。蒟蒻都觉得水。。。
1 /************************************************************** 2 Problem: 1631 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:196 ms 7 Memory:2380 kb 8 ****************************************************************/ 9 10 #include <cstdio>11 #include <cstring>12 #include <algorithm>13 14 using namespace std;15 const int N = 1005;16 struct edge{17 int next, to, v;18 }e[100005];19 int n, m, S, X, Y, Z, tot;20 int q[100005], dis[N], first[N], dis1[N], ANS;21 bool v[N];22 23 inline int read(){24 int x = 0, sgn = 1;25 char ch = getchar();26 while (ch < ‘0‘ || ch > ‘9‘){27 if (ch == ‘-‘) sgn = -1;28 ch = getchar();29 }30 while (ch >= ‘0‘ && ch <= ‘9‘){31 x = x * 10 + ch - ‘0‘;32 ch = getchar();33 }34 return sgn * x;35 }36 37 inline void add_edge(int x, int y, int z){38 e[++tot].next = first[x], first[x] = tot;39 e[tot].to = y, e[tot].v = z;40 }41 42 void spfa(int S){43 memset(dis, 127, sizeof(dis));44 q[0] = S, dis[S] = 0, v[S] = 1;45 int p, x, y;46 for (int l = 0, r = 0; l <= r; ++l){47 p = q[l];48 for (x = first[p]; x; x = e[x].next){49 y = e[x].to;50 if (dis[p] + e[x].v < dis[y]){51 dis[y] = dis[p] + e[x].v;52 if (!v[y])53 v[y] = 1, q[++r] = y;54 }55 }56 v[p] = 0;57 }58 }59 60 int main(){61 n = read(), m = read(), S = read();62 for (int i = 1; i <= m; ++i){63 X = read(), Y = read(), Z = read();64 add_edge(X, Y, Z);65 }66 for (int i = 1; i <= n; ++i){67 spfa(i);68 dis1[i] = dis[S];69 }70 spfa(S);71 for (int i = 1; i <= n; ++i)72 ANS = max(ANS, dis[i] + dis1[i]);73 printf("%d\n", ANS);74 return 0;75 }
(p.s. 感觉做法已经很快了啊。。。那些20ms的人心态呢。。。都是怎么做的。。。)
BZOJ1631 [Usaco2007 Feb]Cow Party
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。