//费用流模板
struct Edge
{
int u,v,c,f,cost;
Edge(){}
Edge(int x,int y,int up,int flow,int co)
{
u=x,v=y,c=up,f=flow,cost=co;
}
};
struct MCMF
{
int ecnt,head[maxm],next[maxm*maxm];
int s,t,dist[maxm],vis[maxm],a[maxm];
int pre[maxm];
queue<int >Q;
Edge edges[maxm*maxm];
void init(int T)
{
s=0,t=T;
ecnt=0;
for (int i =0;i<=T;i++)head[i]=-1;
}
void addedge(int u,int v,int c,int cost)
{
edges[ecnt]=Edge(u,v,c,0,cost);
next[ecnt]=head[u];
head[u]=ecnt++;
edges[ecnt]=Edge(v,u,0,0,-cost);
next[ecnt]=head[v];
head[v]=ecnt++;
}
bool spfa(int &flow,int &cost)
{
for (int i=0;i<=t;i++)dist[i]=INF,vis[i]=0,a[i]=INF;
dist[0]=0;
Q.push(0);
while (!Q.empty())
{
int u=Q.front();
Q.pop();
vis[u]=0;
for (int i=head[u];i!=-1;i=next[i])
{
Edge e=edges[i];
if (e.c>e.f&&dist[e.v]>dist[u]
ACM图论模板
最新推荐文章于 2021-08-12 11:18:15 发布