zoukankan      html  css  js  c++  java
  • 奶牛的身高(差分约束)

    奶牛的身高

    题目描述:
    奶牛们在FJ的养育下茁壮成长。这天,FJ给了奶牛Bessie一个任务,去看看每个奶牛场中若干只奶牛的身高,由于Bessie是只奶牛,无法直接看出第i只奶牛的身高,而只能看出第i只奶牛与第j只奶牛的身高差,其中第i 只奶牛与第j只奶牛的身高差为A(i<=n)。当A大于0时表示这只奶牛比前一只奶牛高A cm,小于0时则是低。现在,FJ让Bessie总共去看了m次身高,当然也就传回给FJ m对奶牛的身高差,但是Bessie毕竟是奶牛,有时候眼睛可能会不好使……(大雾)你的任务是帮助FJ来判断是不是需要给Bessie看看眼睛了……
    注:Hj-Hi=A 注意T1的样例 注意注意注意 重要的事情说三遍。
    输入描述:
    第一行为一个正整数w,表示有w组数据,即w个奶牛场,需要你判断。每组数据的第一行为两个正整数n和m,分别表示对应的奶牛场中的奶牛只数以及看了多少个对奶牛身高差。接下来的m行表示Bessie看m次后传回给FJ的m条信息,每条信息占一行,有三个整数s,t和v,表示第s只奶牛与第t只奶牛的身高差为v。
    输出描述:
    包含w行,每行是”Bessie’s eyes are good”或”Bessie is blind.”(不含双引号),其中第i行为”Bessie’s eyes are good”当且仅当第i组数据,即无法从第i个奶牛场传回的身高差判断Bessie视力好不好;第i行为”Bessie is blind.”当且仅当第i组数据,即从第i个奶牛场传回的身高差是有问题的。
    样例输入:
    2
    3 3
    1 3 10
    2 3 5
    1 2 5
    4 3
    1 4 100
    3 4 50
    1 3 100
    样例输出:
    Bessie’s eyes are good
    Bessie is blind.
    数据范围及提示:
    对于30%的数据,保证n<=100,m<=1000;
    对于100%的数据,保证w<=100,n<=1000,m<=30000,|A|<=30000.
    思路:
    差分约束的变形,如果a-b=x,b-c=y,a-c=z,则1式+2式为:a-c=x+y,只需判断x+y是否等于z即可,这与差分约束的思路是一样的,那么这道题就成了一道图论题,用spfa即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int maxn=100010;
    const int inf=0x7fffffff;
    struct node
    {
        int to;
        int w;
        int next;
    }e[maxn*2];
    queue<int> q;
    bool can,flag[maxn];
    int t,n,m,tot,head[maxn],dis[maxn];
    void add_edge(int u,int v,int w)
    {
        tot++;
        e[tot].to=v;
        e[tot].w=w;
        e[tot].next=head[u];
        head[u]=tot;
    }
    bool spfa(int u)
    {
        while(!q.empty()) q.pop();
        flag[u]=1;q.push(u);
        while(!q.empty())
        {
            u=q.front();
            q.pop();
            for(int i=head[u];i!=-1;i=e[i].next)
            {
                int v=e[i].to;
                if(flag[v])
                if(dis[v]!=dis[u]+e[i].w)
                return 1;
                dis[v]=dis[u]+e[i].w;
                if(!flag[v])
                q.push(v);
                flag[v]=1;
            }
        }
        return 0;
    }
    int main()
    {
        int x,y,z;
        scanf("%d",&t);
        while(t--)
        {
            memset(head,0xfff,sizeof(head));
            memset(flag,0,sizeof(flag));
            memset(dis,0,sizeof(dis));
            cin>>n>>m;tot=0;can=0;
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d",&x,&y,&z);
                add_edge(x,y,z);
                add_edge(y,x,-z);
            }
            for(int i=1;i<=n;i++)
            if(spfa(i))
            {
                puts("Bessie is blind.");
                can=1;
                break;
            }
            if(!can)
            puts("Bessie's eyes are good");
        }
        return 0;
    }
  • 相关阅读:
    Spring中的AOP
    P2782 友好城市
    1576 最长严格上升子序列
    1058 合唱队形 2004年NOIP全国联赛提高组
    5294 挖地雷
    1643 线段覆盖 3
    4768 跳石头
    1026 逃跑的拉尔夫
    2727:仙岛求药
    codevs 4888 零件分组
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070917.html
Copyright © 2011-2022 走看看