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的模板

发布了62 篇原创文章 · 获赞 1 · 访问量 1012

猜你喜欢

转载自blog.csdn.net/wmhtxdy/article/details/103715566