【置顶】模板集合

cdcq

2018-03-06 22:10:19

Personal

退役后的某天我复习堆得时候,发现以前写的代码真的是太丑了…… 于是决定再再再整一个模板集合 (洛谷博客没有代码折叠不太方便啊…… ------------ emacs配置: ``` (setq-default tab-width 4) (setq-default c-basic-offset 4) (global-linum-mode t) ``` vim配置: ``` set number set ts=4 set sw=4 set smarttab color desert syntax on set cindent ``` (小根)堆: ```cpp int hp[1100000],ht=0; void ist(int z){ int x; hp[x=(++ht)]=z;//最小元素为1比为0好写不知道哪里去了! while(x!=1 && hp[x]<hp[x>>1]) swap(hp[x],hp[x>>1]),x>>=1; } void dlt(){ hp[1]=hp[ht--]; int x=1,mxid=1; for(;;){ mxid=x; if((x<<1)<=ht && hp[x<<1]<hp[mxid]) mxid=(x<<1);//判断是否超出堆的大小不要丢 if((x<<1|1)<=ht && hp[x<<1|1]<hp[mxid]) mxid=(x<<1|1); if(mxid==x) break; swap(hp[mxid],hp[x]); x=mxid; } } ``` dinic: ```cpp int lvl[11000]; int q[11000],hd=0; bool gtlvl(){ memset(lvl,0,sizeof(lvl)); lvl[q[hd=1]=s]=1; //这里lvl[s]好像不能设成0,因为下面mxflw判断lvl的时候好像会把已经挂成0的点通到lvl为1的点上 for(int k=1;k<=hd;++k) for(int i=lk[q[k]];i;i=e[i].nxt)if(e[i].v && !lvl[e[i].y]) lvl[e[i].y]=lvl[q[k]]+1,q[++hd]=e[i].y; return lvl[t]; } int mxflw(int x,int y){ if(x==t) return y; int flw=0,bwl=0; for(int i=lk[x];i && bwl<y;i=e[i].nxt)if(e[i].v && lvl[e[i].y]==lvl[x]+1) if((flw=mxflw(e[i].y,min(e[i].v,y-bwl)))) e[i].v-=flw,e[e[i].rvs].v+=flw,bwl+=flw; if(!bwl) lvl[x]=0; return bwl; } int dnc(){ int flw=0,bwl=0; while(gtlvl())while((flw=mxflw(s,oo))) bwl+=flw; return bwl; } ```