OI中的一些注意事项

有关二分图最大匹配

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的途中就更新。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值