• [luoguP3275] [SCOI2011]糖果(差分约束)


    传送门

    差分约束裸题

    但是坑!

    有一个点是长为10W的链,需要逆序加边才能过(真是玄学)

    还有各种坑爹数据

    开longlong

    ——代码

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #define N 200001
     5 
     6 int n, k, cnt;
     7 long long ans, dis[N];
     8 int head[N], to[N << 1], val[N << 1], next[N << 1];
     9 bool vis[N];
    10 
    11 inline int read()
    12 {
    13     int x = 0, f = 1;
    14     char ch = getchar();
    15     for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
    16     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
    17     return x * f;
    18 }
    19 
    20 inline void add(int x, int y, int z)
    21 {
    22     to[cnt] = y;
    23     val[cnt] = z;
    24     next[cnt] = head[x];
    25     head[x] = cnt++;
    26 }
    27 
    28 inline bool spfa(int u)
    29 {
    30     int i, v;
    31     vis[u] = 1;
    32     for(i = head[u]; i ^ -1; i = next[i])
    33     {
    34         v = to[i];
    35         if(dis[v] > dis[u] + val[i])
    36         {
    37             dis[v] = dis[u] + val[i];
    38             if(vis[v]) return 0;
    39             else if(!spfa(v)) return 0;
    40         }
    41     }
    42     vis[u] = 0;
    43     return 1;
    44 }
    45 
    46 int main()
    47 {
    48     int i, j, x, y, z;
    49     n = read();
    50     k = read();
    51     memset(head, -1, sizeof(head));
    52     for(i = n; i >= 1; i--) add(0, i, -1);
    53     for(i = 1; i <= k; i++)
    54     {
    55         z = read();
    56         x = read();
    57         y = read();
    58         if(z == 1) add(x, y, 0), add(y, x, 0);
    59         if(z == 2)
    60         {
    61             add(x, y, -1);
    62             if(x == y)
    63             {
    64                 puts("-1");
    65                 return 0;
    66             }
    67         }
    68         if(z == 3) add(y, x, 0);
    69         if(z == 4)
    70         {
    71             add(y, x, -1);
    72             if(x == y)
    73             {
    74                 puts("-1");
    75                 return 0;
    76             }
    77         }
    78         if(z == 5) add(x, y, 0);
    79     }
    80     if(spfa(0))
    81     {
    82         for(i = 1; i <= n; i++) ans -= dis[i];
    83         printf("%lld
    ", ans);
    84     }
    85     else puts("-1");
    86     return 0;
    87 } 
    View Code
  • 相关阅读:
    vagrant up报错 Warning: Authentication failure. Retrying...解决方案
    node读写Excel操作
    批量转换word为pdf
    分享7个shell脚本实例--shell脚本练习必备
    shell脚本实例,通向shell脚本大师的必经之路
    前端优化DNS预解析
    如何选择开源协议
    深入理解document.referrer的用法
    使用 WebRTC 构建简单的前端视频通讯
    深入理解WebRTC
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/7027859.html
Copyright © 2020-2023  润新知