zoukankan      html  css  js  c++  java
  • BZOJ2100 [Usaco2010 Dec]Apple Delivery

    水水更健康。。。话说回来,这真的是水题?T T

    首先,容易想到:

    令ans1 = t1为源,到s和t2的距离之和;ans2 = t2为源,到s和t1的距离之和

    ans = min(ans1, ans2)

    然后,开始写单元最短路。。。spfa。。。

     1 /**************************************************************
     2     Problem: 2100
     3     User: rausen
     4     Language: C++
     5     Result: Time_Limit_Exceed
     6 ****************************************************************/
     7  
     8 #include <cstdio>
     9 #include <cctype>
    10 #include <cstring>
    11 #include <algorithm>
    12  
    13 using namespace std;
    14 const int N = 100005;
    15 const int M = 400005;
    16  
    17 struct edges {
    18     int next, to, v;
    19     edges() {}
    20     edges(int _next, int _to, int _v) : next(_next), to(_to), v(_v) {}
    21 }e[M];
    22  
    23 int n, m, s, T1, T2;
    24 int first[N], tot;
    25 int q[N], l, r, dis[N];
    26 bool v[N];
    27 int ans;
    28  
    29 inline int read() {
    30     int x = 0;
    31     char ch = getchar();
    32     while (!isdigit(ch))
    33         ch = getchar();
    34     while (isdigit(ch)) {
    35         x = x * 10 + ch - '0';
    36         ch = getchar();
    37     }
    38     return x;
    39 }
    40  
    41 inline void Add_Edges(int x, int y, int z) {
    42     e[++tot] = edges(first[x], y, z), first[x] = tot;
    43     e[++tot] = edges(first[y], x, z), first[y] = tot;
    44 }
    45  
    46 void spfa(int S) {
    47     memset(dis, 127 / 3, sizeof(dis));
    48     q[0] = S, dis[S] = 0, v[S] = 1;
    49     int p, x, y;
    50     for (l = 0, r = 0; l != (r + 1) % N; (++l) %= N) {
    51         p = q[l];
    52         for (x = first[p]; x; x = e[x].next)
    53             if (dis[p] + e[x].v < dis[(y = e[x].to)]) {
    54                 dis[y] = dis[p] + e[x].v;
    55                 if (!v[y])
    56                     v[y] = 1, q[(++r) %= N] = y;
    57             }
    58         v[p] = 0;
    59     }
    60 }
    61  
    62 int main() {
    63     int i, X, Y, Z;
    64     m = read(), n = read(), s = read();
    65     T1 = read(), T2 = read();
    66     for (i = 1; i <= m; ++i){
    67         X = read(), Y = read(), Z = read();
    68         Add_Edges(X, Y, Z);
    69     }
    70     spfa(T1);
    71     ans = dis[s] + dis[T2];
    72     spfa(T2);
    73     printf("%d
    ", min(ans, dis[s] + dis[T1]));
    74     return 0;
    75 }
    View Code(spfa)

     于是,TLE!!!竟然卡spfa!!!我去!!!

    改成Dijkstra就好了。

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

    (p.s. Rank5液!话说hzwer的spfa版是怎么过这题的。。。不明= =)

    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    v-if与v-show的区别
    vue 初始化项目
    element-ui的el-table中添加递增序号
    根据下拉框中选择的列在下面表格中显示对应的列
    element-ui中el-input需要改变placeholder的字体颜色
    根据不同路由,使对应的菜单高亮显示
    中间文字,两边横线的css3伪元素的使用
    关于正则表达式进行自定义校验
    对输入的表单内容自定义校验
    vue实现登录之后长时间未操作,退出登录
  • 原文地址:https://www.cnblogs.com/rausen/p/4100369.html
Copyright © 2011-2022 走看看