• 洛谷 P1993 小K的农场 题解


    每日一题 day55 打卡

    Analysis

    这是我们一次考试的T1,但我忘了差分约束系统怎么写了,所以就直接输出Yes混了60分

    首先转化题目:

    1:表示农场 a 比农场 b 至少多种植了 c 个单位的作物。即a>=b+c 转化后为 b-a<=-c

    2:表示农场 a 比农场 b 至多多种植了 c 个单位的作物。即a<=b+c 转化后为 a-b<=c

    3:表示农场 a 与农场 b 种植数一样 即a=b 可以表示为 a-b<=0 与 b-a<=0

    接下来就是判负环了 而为什么是判负环呢? 因为由题意可得 a>b且b>a一定是不合法的(即情况1的矛盾)而正环、正+负环、以及中间穿插0的情况都是合法的(脑补即可)

    至于情况3我觉得是影响不大的 甚至会更容易理解,因为不是更优就不会选这条路。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define maxn 10010
     6 #define rep(i,s,e) for(register int i=s;i<=e;++i)
     7 #define dwn(i,s,e) for(register int i=s;i>=e;--i)
     8 using namespace std;
     9 inline int read()
    10 {
    11     int x=0,f=1;
    12     char c=getchar();
    13     while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}
    14     while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
    15     return f*x;
    16 }
    17 int n,m,cnt;
    18 int head[maxn],book[maxn],dis[maxn];
    19 struct node
    20 {
    21     int v,w,nex;
    22 }edge[4*maxn];
    23 inline int add(int x,int y,int z)
    24 {
    25     edge[++cnt].v=y;
    26     edge[cnt].w=z;
    27     edge[cnt].nex=head[x];
    28     head[x]=cnt;
    29 }
    30 bool SPFA(int from)
    31 {
    32     book[from]=1;
    33     for(int i=head[from];i;i=edge[i].nex)
    34     {
    35         int to=edge[i].v,val=edge[i].w;
    36         if(dis[to]>dis[from]+val)
    37         {
    38             dis[to]=dis[from]+val;
    39             if(book[to]==true) return false;
    40             if(SPFA(to)==false) return false;
    41         }
    42     }  
    43     book[from]=0;
    44     return true;
    45 }
    46 int main()
    47 {
    48     memset(dis,127,sizeof(dis));
    49     n=read();m=read();
    50     rep(i,1,m)
    51     {
    52         int in=read();
    53         if(in==1)
    54         {
    55             int a=read(),b=read(),c=read();
    56             add(a,b,-c);
    57         }
    58         else if(in==2)
    59         {
    60             int a=read(),b=read(),c=read();
    61             add(b,a,c);
    62         }
    63         else if(in==3)
    64         {
    65             int a=read(),b=read();
    66             add(a,b,0);
    67             add(b,a,0);
    68         }
    69     }
    70     rep(i,1,n) add(n+1,i,0);
    71     dis[n+1]=0;
    72     if(SPFA(n+1)==true) printf("Yes");
    73     else printf("No");
    74     return 0;
    75 }

    请各位大佬斧正(反正我不认识斧正是什么意思)

  • 相关阅读:
    属性MyBank
    C#语法
    NTE与C#
    css3制作网页动画
    网页定位元素
    使用ADO.NET访问数据库
    连接查询和分组查询
    模糊查询和聚合函数
    习题集
    用sql语句操作数据
  • 原文地址:https://www.cnblogs.com/handsome-zyc/p/12001782.html
Copyright © 2020-2023  润新知