嗯……事情是这样的……本蒟蒻的Dinic属于半打版半YY然后直接扔到CodeVS的草地排水上评测……然而万万没想到大家说的CV评测机太666……我胡搞乱搞调了好几个月的bug……竟然…………没有WA没有T直接欢快地A了…………于是…………嗯……以上大概就是背景x 在又一次刷低了bzoj的AC率后_(:зゝ∠)_ 蒟蒻Flaze终于在用Dev手动debug戳了1k+次鼠标后……发现……我的初始化炸掉了【悲伤逆流成河x
嗯 吐槽到此为止……
以下………………
于是就直接从当前弧优化搞起就好了 顺便……等等……再槽一句……CV的评测姬啊,一颗赛艇
int a=-1;
if(a)
printf("233\n");
其实也是不会输出233的…………
So………………注意…………初始化的时候直接全部初始化成0就好…………不然卡成狗还找不到哪里炸了【哭……
struct t1{
int to,nxt,liu;
}edge[200057]; int cnt_edge=1;//注意1^1=0 所以比起从零开始记录 干脆舍弃0,1两个空间从二开始记好了……减少代码复杂度233333
memset(fst,0,sizeof(fst));
memset(edge,0,sizeof(edge));
嗯…………于是直接上板好了……其实已经被修改的和模板差不多了2333
int dfs(int now,int low){
if(now==T) return low;
int rst=low;
for(int &tmp=cur[now];tmp;tmp=edge[tmp].nxt){
if(edge[tmp].liu<=0||dis[edge[tmp].to]!=(dis[now]+1)) continue;
int tt;
if(tt=dfs(edge[tmp].to,min(rst,edge[tmp].liu))){
edge[tmp].liu-=tt;
edge[tmp^1].liu+=tt;
rst-=tt;
if(!rst) return low;
}
}
if(rst==low) dis[now]=-1;
return low-rst;
}
bool bfs(){
memset(dis,-1,sizeof(dis));
dis[0]=qu[0]=0;
head=0,tail=1;
int x;
while(head^tail){
x=qu[head++];
for(int tmp=fst[x];tmp;tmp=edge[tmp].nxt){
if(edge[tmp].liu<=0||~dis[edge[tmp].to]) continue;
qu[tail++]=edge[tmp].to;
dis[edge[tmp].to]=dis[x]+1;
}
}
return ~dis[T];
}
void dinic(){
while(bfs()){
for(int i=S;i<=T;++i) cur[i]=fst[i];
ans+=dfs(S,1000000000);
}
}
大概……之后再多码几次……dfs以前的写法……是这样的↓【大概要慢一些……需要多调用几次dfs 可能被卡常【毕竟有lxl大神这种热爱卡常的菊苣存在【哭唧唧x
int dfs(int now,int low){
if(now==T) return low;
for(int &tmp=cur[now];tmp;tmp=edge[tmp].nxt){
if(edge[tmp].liu<=0||dis[edge[tmp].to]!=(dis[now]+1)) continue;
int tt;
if(tt=dfs(edge[tmp].to,min(low,edge[tmp].liu))){
edge[tmp].liu-=tt;
edge[tmp^1].liu+=tt;
return tt;
}
}
return 0;
}
然后dinic内部相当于是两个while循环
void dinic(){
while(bfs()){
for(int i=S;i<=T;++i) cur[i]=fst[i];
int tt;
while(tt=dfs(S,1000000000))ans+=tt;
}
}
但是第二种……大概代码复杂度可以减弱x
顺便附两种写法【虽然差不多】在CV上做切糕的时间对比↓【不要在意代码长度 我写的一向比较丑2333
1.
2.
顺便……毕竟是CV的评测机……跑多快都不要在意23333