有关二分图最大匹配
bool dfs(int u){
for(int i=h[u];i;i=e[i].p){
int v=e[i].v;
if(vis[v])continue;//二分图匹配关心的应该是被匹配点的vis
vis[v]=1;
if((!link[v])||dfs(link[v])){
link[v]=u;return 1;
}
}
return 0;
}
错解
这样也可以过luogu的模板
bool dfs(int u){
if(vis[u])return 0;
vis[u]=1;//不是关心匹配的点
for(int i=h[u];i;i=e[i].p){
int v=e[i].v;
if((!link[v])||dfs(link[v])){
link[v]=u;return 1;
}
}
return 0;
}
有关网络最大流
ll dfs(ll now,ll rest)
{
if(now==t)return rest;
ll di,tot=0;
for(ll &i=ht[now];i;i=p[i]){
ll v1=v[i];
if(w[i]>0&&dis[v1]==dis[now]+1){
di=dfs(v1,min(rest,w[i]));//否则这里的流量会有问题
w[i]-=di;w[i^1]+=di;
rest-=di;tot+=di;//rest需要-di
if(rest==0)break;//注意这里是rest==0,不是rest==tot
}
}
return tot;
}
即使是错解也可以过luogu的模板
(以前的惨痛教训)
1、多测不清空,爆零两行泪。。。(多测时千万要留一个心眼!尤其是第一次写的时候要明确自己哪些数组要清空)
2、数组开小!!!(这是一个有时候很难注意的问题,具体来讲,输出答案有时候比输入要长,这时一定要注意把数组开大。)
3、特判无解情况…这个是有时候不会注意到的问题,具体来讲,当一个题可能无解的时候,一定要注意上来就在代码里写注释,说这题有无解情况来提醒自己。
4、文件名的问题:这个最为致命,但又最容易检查出来。每次应该先把文件名抄在纸上,再写在代码里。然后在考试结束前半个小时,一定要细致地检查一遍文件名。以及上述所有错误。
5、网络流的边编号从2开始,原因是方便找反向边。但是这个也很容易忘记。
6、一定要看清题(oi的题目明明不多,而且描述一般十分清晰,我居然经常看错题。。。这非常值得重视)
7、维护树形问题的倍增数组时,一定要注意更新顺序(即枚举顺序),要按深度顺序来,比方说:
for(int i=1;i<=20;i++)for(int u=1;u<=n;u++)
这两重循环的位置不能写反,否则会出现用没更新的位置计算,或者在dfs的途中就更新。