zoukankan      html  css  js  c++  java
  • BZOJ 2330: [SCOI2011]糖果( 差分约束 )

    坑爹...要求最小值要转成最长路来做.... 

    小于关系要转化一下 , A < B -> A <= B - 1 

    --------------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<iostream>
      
    #define rep(i, n) for(int i = 0; i < n; i++)
    #define clr(x, c) memset(x, c, sizeof(x))
      
    using namespace std;
     
    const int maxn = 100009;
     
    struct edge {
    int to, w;
    edge*next;
    } E[maxn << 1], *pt = E, *head[maxn];
     
    inline void add_edge(int u, int v, int w) {
    pt->to = v, pt->w = w;
    pt->next = head[u];
    head[u] = pt++;
    }
     
    bool inQ[maxn];
    int d[maxn], cnt[maxn], n;
    queue<int> Q;
     
    bool spfa() {
    rep(i, n)
       d[i] = 1, inQ[i] = true, Q.push(i), cnt[i] = 1;
    while(!Q.empty()) {
    int x = Q.front(); Q.pop();
    inQ[x] = false;
    for(edge*e = head[x]; e; e = e->next) if(d[e->to] < d[x] + e->w) {
    d[e->to] = d[x] + e->w;
    if(!inQ[e->to]) {
    if(++cnt[e->to] > n) return false;
    inQ[e->to] = true, Q.push(e->to);
    }
    }
    }
    return true;
    }
      
    int main() {
    freopen("test.in", "r", stdin);
    clr(head, 0);
    int k;
    cin >> n >> k;
    while(k--) {
    int x, a, b;
    scanf("%d%d%d", &x, &a, &b);
    a--, b--;
    switch(x) {
    case 1: add_edge(a, b, 0); add_edge(b, a, 0); break;
    case 2: add_edge(a, b, 1); break;
    case 3: add_edge(b, a, 0); break;
    case 4: add_edge(b, a, 1); break;
    case 5: add_edge(a, b, 0); break;
    default: break;
    }
    }
    if(!spfa()) 
       puts("-1");
    else {
    long long ans = 0;
    rep(i, n) ans += d[i];
    printf("%lld ", ans);
    }
    return 0;
    }

    -------------------------------------------------------------------------- 

    2330: [SCOI2011]糖果

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 3064  Solved: 907
    [Submit][Status][Discuss]

    Description

    幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求。幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。

    Input

    输入的第一行是两个整数N,K。

    接下来K行,表示这些点需要满足的关系,每行3个数字,X,A,B。

    如果X=1, 表示第A个小朋友分到的糖果必须和第B个小朋友分到的糖果一样多;

    如果X=2, 表示第A个小朋友分到的糖果必须少于第B个小朋友分到的糖果

    如果X=3, 表示第A个小朋友分到的糖果必须不少于第B个小朋友分到的糖果

    如果X=4, 表示第A个小朋友分到的糖果必须多于第B个小朋友分到的糖果

    如果X=5, 表示第A个小朋友分到的糖果必须不多于第B个小朋友分到的糖果;

    Output

    输出一行,表示lxhgww老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出-1。

    Sample Input

    5 7

    1 1 2

    2 3 2

    4 4 1

    3 4 5

    5 4 5

    2 3 5

    4 5 1

    Sample Output


    11

    HINT

    【数据范围】


        对于30%的数据,保证 N<=100


        对于100%的数据,保证 N<=100000


    对于所有的数据,保证 K<=100000,1<=X<=5,1<=A, B<=N

    Source

  • 相关阅读:
    ajax请求地址后加随机数防止浏览器缓存
    全新跨平台版本.NET敏捷开发框架-RDIFramework.NET5.0震撼发布
    一网打尽,一文讲通虚拟机VirtualBox及Linux使用
    解放双手,markdown文章神器,Typora+PicGo+七牛云图床实现自动上传图片
    VS2019 创建C++动态库dll----C#调用
    AOP面向切面的编程使用Interceptor内置的容器进行属性注入
    使用IOC内置的容器进行属性注入
    对于2021年整体预判
    亲子教育的六个阶段
    Win10 损坏硬盘命令
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4658214.html
Copyright © 2011-2022 走看看