zoukankan      html  css  js  c++  java
  • BZOJ3436 小K的农场

    首先这是个查分约束系统。。。(那是啥来着←_←)

    然后判断可行解的话,直接spfa判负圈。

    bfs版spfa要记录每个点的进队次数,如果大于点数就代表有负圈。。。但是好慢Σ( ° △ °|||)︴

    于是改用dfs版的spfa(还以为会很慢。。。,其实速度极快Orz)

     1 /**************************************************************
     2     Problem: 3436
     3     User: rausen
     4     Language: C++
     5     Result: Accepted
     6     Time:36 ms
     7     Memory:1236 kb
     8 ****************************************************************/
     9  
    10 #include <cstdio>
    11  
    12 using namespace std;
    13 const int N = 10005;
    14 const int M = N;
    15 const int Maxlen = 20 * M;
    16  
    17 struct edges {
    18     int next, to, v;
    19     edges() {}
    20     edges(int _n, int _t, int _v) : next(_n), to(_t), v(_v) {}
    21 } e[M];
    22  
    23 int n, m;
    24 int first[N], tot;
    25 int d[N];
    26 int v[N], flag;
    27 char buf[Maxlen], *c = buf;
    28 int Len;
    29  
    30 inline int read() {
    31     int x = 0;
    32     while (*c < '0' || '9' < *c) ++c;
    33     while ('0' <= *c && *c <= '9')
    34         x = x * 10 + *c - '0', ++c;
    35     return x;
    36 }
    37  
    38 inline void add_edge(int x, int y, int z) {
    39     e[++tot] = edges(first[x], y, z);
    40     first[x] = tot;
    41 }
    42  
    43 void spfa(int p) {
    44     if (v[p]) {
    45         flag = 1;
    46         return;
    47     }
    48     int x, y;
    49     v[p] = 1;
    50     for (x = first[p]; x; x = e[x].next)
    51         if (d[p] + e[x].v < d[y = e[x].to]) {
    52             d[y] = d[p] + e[x].v;
    53             spfa(y);
    54             if (flag) return;
    55         }
    56     v[p] = 0;
    57 }
    58  
    59 int main() {
    60     Len = fread(c, 1, Maxlen, stdin);
    61     buf[Len] = '';
    62     int i, oper, x, y, z;
    63     n = read(), m = read();
    64     for (i = 1; i <= m; ++i) {
    65         oper = read(), x = read(), y = read();
    66         if (oper == 3) add_edge(x, y, 0);
    67         else {
    68             z = read();
    69             if (oper == 1) add_edge(x, y, -z);
    70             else add_edge(y, x, z);
    71         }
    72     }
    73     for (i = 1; i <= n; ++i) {
    74         spfa(i);
    75         if (flag) break;
    76     }
    77     puts(flag ? "No" : "Yes");
    78     return 0;
    79 }
    View Code
    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    Python_匿名函数
    Python_内置函数之map()
    Python_面向对象_单例模式
  • 原文地址:https://www.cnblogs.com/rausen/p/4133411.html
Copyright © 2011-2022 走看看