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