笨笨 Oken 你是不是又忘了模板怎么写/xin

不定时写一些模板,复习写法。

2025.12.18 最大流 Dinic

const long long INF=0x3f3f3f3f3f3f3f3f;
const int N,M;
int n,m,s,t,tot_edge;
int from[2*M+10],to[2*M+10],nxt[2*M+10];
long long cap[2*M+10];
int head[N+10],cur[N+10],level[N+10];
bool bfs(){
	for(int i=1;i<=n;i++){
		level[i]=-1;
	}
	queue<int> q;
	level[s]=0;
	q.push(s);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u];~i;i=nxt[i]){
			int v=to[i];
			if(cap[i]  &&  level[v]==-1){
				level[v]=level[u]+1;
				q.push(v);
			}
		}
	}
	return level[t]!=-1;
}
long long dfs(int u,long long flow){
	if(u==t  ||  flow==0){
		return flow;
	}
	long long ans=0;
	for(int i=cur[u];~i;i=nxt[i]){
		cur[u]=i;
		int v=to[i];
		if(cap[i]  &&  level[v]==level[u]+1){
			long long res=dfs(v,min(flow,cap[i]));
			ans+=res;
			flow-=res;
			cap[i]-=res;
			cap[i^1]+=res;
			if(flow==0){
				break;
			}
		}
	}
	return ans;
}
long long Dinic(){
	long long max_flow=0;
	while(bfs()){
		for(int i=1;i<=n;i++){
			cur[i]=head[i];
		}
		max_flow+=dfs(s,INF);
	}
	return max_flow;
}
void add_edge(int u,int v,long long w){
	from[tot_edge]=u;
	to[tot_edge]=v;
	cap[tot_edge]=w;
	nxt[tot_edge]=head[u];
	head[u]=tot_edge;
	tot_edge++;
}
void init(){
	tot_edge=0;
	memset(nxt,-1,sizeof(nxt));
	memset(head,-1,sizeof(head));
}

完整代码提交记录,洛谷模板。

posted @ 2025-12-18 18:07  Oken喵~  阅读(7)  评论(2)    收藏  举报