• 【BZOJ2300】【SCOI2011】糖果


    差点就忘了还有差分约束这个东西……看见了就要学习一个

    原题:

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

    N<=100000,K<=100000,1<=A, B<=N

    差分约束模板题,学习一个!

    以操作3为例,如果a不少于b,那么a-b>=0,a>=b+0

    所以连b到a权值为0的边,根据三角形不等式,要跑最长路来使条件满足

    具体原理我也想不太清楚,反正记住搞出三角形不等式后跑符号相反的spfa就对了 _(:3 」∠)_

    因为写出了像"q[tl]=false"酱sb的东西+没对拍所以没1A……

    注意longlong

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 using namespace std;
     7 int rd(){int z=0,mk=1;  char ch=getchar();
     8     while(ch<'0'||ch>'9'){if(ch=='-')mk=-1;  ch=getchar();}
     9     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
    10     return z*mk;
    11 }
    12 struct ddd{int nxt,y,v;}e[210000];  int lk[110000],ltp=0;
    13 inline void ist(int x,int y,int z){  e[++ltp].nxt=lk[x],lk[x]=ltp,e[ltp].y=y,e[ltp].v=z;}
    14 int n,m;
    15 int dstc[110000],cnt[110000];
    16 int q[110000],hd=0,tl=0,tp=100001;  bool vstd[110000];
    17 bool spfa(){
    18     memset(vstd,0,sizeof(vstd));
    19     //memset(dstc,0,sizeof(dstc));
    20     for(int i=1;i<=n;++i)  q[++hd]=i,dstc[i]=1;
    21     while(tl!=hd){
    22         tl=(tl==tp ? 0 : tl+1);
    23         for(int i=lk[q[tl]];i;i=e[i].nxt)if(dstc[q[tl]]+e[i].v>dstc[e[i].y]){
    24             dstc[e[i].y]=dstc[q[tl]]+e[i].v;
    25             if(++cnt[e[i].y]==n)  return false;
    26             if(!vstd[e[i].y])  q[hd=(hd==tp ? 0 : hd+1)]=e[i].y,vstd[e[i].y]=true;
    27         }
    28         vstd[q[tl]]=false;
    29     }
    30     return true;
    31 }
    32 int main(){//freopen("ddd.in","r",stdin);
    33     cin>>n>>m;
    34     int mk,l,r;
    35     while(m--){
    36         mk=rd(),l=rd(),r=rd();
    37         if(mk==1)  ist(l,r,0),ist(r,l,0);
    38         else if(mk==2){
    39             if(l==r){  cout<<-1<<endl;  return 0;}
    40             ist(l,r,1);
    41         }
    42         else if(mk==3)  ist(r,l,0);
    43         else if(mk==4){
    44             if(l==r){  cout<<-1<<endl;  return 0;}
    45             ist(r,l,1);
    46         }
    47         else if(mk==5)  ist(l,r,0);
    48     }
    49     if(!spfa()){  cout<<-1<<endl;  return 0;}
    50     long long ans=0;
    51     for(int i=1;i<=n;++i)  ans+=dstc[i];
    52     cout<<ans<<endl;
    53     return 0;
    54 }
    View Code
  • 相关阅读:
    计算机技术与软件专业以考代评政策之我见
    关于设立运营部门的我的几点建议
    自助式微软BI工具PowerPivot简介!
    写在两年前的公司新版CRM系统需求探讨
    实时音视频开发之开源项目
    vue3.0 使用vue脚手架生成vue项目 运行mapbox 3D地图例子
    Vue开发工具Visual Studio Code 配置插件
    sip协议开源实现
    redis操作
    SIP协议 Java开源jar
  • 原文地址:https://www.cnblogs.com/JSL2018/p/6539363.html
Copyright © 2020-2023  润新知