• 【BZOJ】3436: 小K的农场


    3436: 小K的农场

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 938  Solved: 417
    [Submit][Status][Discuss]

    Description

    背景
    小K是个特么喜欢玩MC的孩纸。。。
    描述
    小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得
    一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多
    多种植了c个单位的作物,农场a与农场b种植的作物数一样多。但是,由于小K的记忆有些偏差,所以他想要知道存
    不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。

    Input

    第一行包括两个整数n和m,分别表示农场数目和小K记忆中的信息的数目接下来m行:如果每行的第一个数是1,接
    下来有三个整数a,b,c,表示农场a比农场b至少多种植了c个单位的作物如果每行第一个数是2,接下来有三个整数a
    ,b,c,表示农场a比农场b至多多种植了c个单位的作物如果每行第一个数是3,接下来有两个整数a,b,表示农场a
    种植的数量与b一样。1<=n,m,a,b,c<=10000

    Output

    如果存在某种情况与小K的记忆吻合,输出”Yes”,否则输出”No”

    Sample Input

    3 3
    3 1 2
    1 1 3 1
    2 2 3 2

    Sample Output

    Yes
    样例解释
    三个农场种植的数量可以为(2,2,1)

    HINT

     

    Source

    Kpmcup#0 By Greens


    入门题!

    设点x,y相差c

    若x==y,x与y之间连两条权值为0的的边

    x-y<=c,y向x连一条权值为c的边

    x-y>=c变形为y-x<=c,x向y连一条权值为-c的边

     

    构出一张有向图,利用SPFA在图中找负权环,若有负权环则说明答案不合法(SPFA找负权环应当使用DFS版的)


     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstdlib>
     5 #include<algorithm>
     6 #include<vector>
     7 #include<cmath>
     8 #include<ctime>
     9 #include<cstring>
    10 #define yyj(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout);
    11 #define llg long long
    12 #define maxn 50000
    13 #define md 20000
    14 #define inf (llg)1e16
    15 using namespace std;
    16 llg i,j,k,n,m,dl[maxn*10],head,tail,dis[maxn],bj[maxn],js[maxn],heh,top,stack[maxn];
    17 bool f;
    18 
    19 vector <llg> a[maxn],val[maxn];
    20 
    21 void link(llg x,llg y,llg v)
    22 {
    23     a[x].push_back(y),val[x].push_back(v);
    24 }
    25 
    26 void init()
    27 {
    28     llg x,y,t,v;
    29     cin>>n>>m;
    30     for (i=1;i<=m;i++)
    31     {
    32         scanf("%lld%lld%lld",&t,&x,&y);
    33         if (t==3)
    34         {
    35             link(x,y,0); link(y,x,0);
    36         }
    37         if (t==2)
    38         {
    39             scanf("%lld",&v);
    40             link(y,x,v);
    41         }
    42         if (t==1)
    43         {
    44             scanf("%lld",&v);
    45             link(x,y,-v);
    46         }
    47     }
    48     f=true;
    49 }
    50 
    51 bool SPFA()
    52 { 
    53     for(llg i=1;i<=n;i++) dis[i]=0,stack[++top]=i,bj[i]=1;
    54     llg u,w;
    55     while(top>0)
    56     {
    57         u=stack[top]; top--; bj[u]=0;
    58         w=a[u].size();
    59         for(llg i=0;i<w;i++)
    60         {
    61             llg v=a[u][i]; 
    62             if(dis[v]>dis[u]+val[u][i])
    63             {
    64                 dis[v]=dis[u]+val[u][i];
    65                 if(!bj[v]) { bj[v]=1; stack[++top]=v; js[v]++; if(js[v]>=n) return false;}
    66             }
    67         }
    68     }
    69     return true;
    70 }
    71 
    72 int main()
    73 {
    74     yyj("a");
    75     init();
    76     if (SPFA()) cout<<"Yes"; else cout<<"No";
    77     return 0;
    78 }
    本文作者:xrdog 作者博客:http://www.cnblogs.com/Dragon-Light/ 转载请注明出处,侵权必究,保留最终解释权!
  • 相关阅读:
    oracle 认证方式
    Oracle
    深入理解Java的接口和抽象类
    mongoDB的学习【小白的福音】
    对于vertical-align的学习
    flex的学习 flexBox的学习
    用伪类添加翘边阴影::before和::after
    icon小图标
    url 中的 ? 和 & 还有 # 的作用
    解决img的1px空白问题
  • 原文地址:https://www.cnblogs.com/Dragon-Light/p/5917075.html
Copyright © 2020-2023  润新知