笨笨 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));
}

浙公网安备 33010602011771号