【BZOJ2300】【SCOI2011】糖果

本文介绍了一道关于幼儿园小朋友分配糖果的问题,通过差分约束系统与SPFA算法解决该问题。讨论了如何建立差分约束模型,并利用SPFA算法求解最短路径以确保所有小朋友都能得到糖果并满足特定条件。

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

原题:

幼儿园里有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

 

转载于:https://www.cnblogs.com/JSL2018/p/6539363.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值