rt,蒟蒻最近做题发现有一题用 类Dinic 过不去,上网找到了zkw 大神的算法和网上其他人的介绍,我发现好像和 类Dinic 没啥差别啊。能否帮蒟蒻康康到底有什么差别/kel。
#include<bits/stdc++.h>
using namespace std;
const int maxn=400+10,inf=0x3fffffff;
struct edge{
int v,cap,cost,next;
}e[(200*200+200+200)*2+10];
int n,h[maxn],cnt,s,t,m,vis[maxn],dis[maxn],mincost;
void addedge(int u,int v,int w1,int w2) {
e[cnt].v=v;
e[cnt].cap=w1;
e[cnt].cost=w2;
e[cnt].next=h[u];
h[u]=cnt++;
}
void insert(int u,int v,int w1,int w2) {
addedge(u,v,w1,w2);
addedge(v,u,0,-w2);
}
bool spfa() {
fill(vis,vis+t+1,0);
fill(dis,dis+t+1,inf);
deque<int> q;
q.push_back(s);
vis[s]=1,dis[s]=0;
while(!q.empty()) {
int u=q.front();
q.pop_front();
vis[u]=0;
for(int i=h[u];~i;i=e[i].next) {
int v=e[i].v;
if(e[i].cap&&dis[u]+e[i].cost<dis[v]) {
dis[v]=dis[u]+e[i].cost;
if(!vis[v]) {
vis[v]=1;
if(!q.empty()&&dis[v]<dis[q.front()]) {
q.push_front(v);
}
else {
q.push_back(v);
}
}
}
}
}
return dis[t]!=inf;
}
int dfs(int u,int maxflow) {
if(u==t) {
return maxflow;
}
vis[u]=1;
int ans=0;
for(int i=h[u];~i&&ans<maxflow;i=e[i].next) {
int v=e[i].v;
if(e[i].cap&&!vis[v]&&dis[v]==dis[u]+e[i].cost) {
int flow=dfs(v,min(maxflow,e[i].cap));
if(flow) {
maxflow-=flow;
ans+=flow;
e[i].cap-=flow;
e[i^1].cap+=flow;
mincost+=e[i].cost*flow;
if(maxflow==0) {
break;
}
}
}
}
vis[u]=0;
return ans;
}
int main()
{
memset(h,-1,sizeof(h));
//建图的过程,蒟蒻就不展示了
int ans=0;
while(spfa()) {
ans+=dfs(s,inf);
}
cout<<mincost<<endl;
return 0;
}