【图论】最小费用流模板

求达到流量f的最小费用

/* 最小费用流模板(限定最小流量)
 * vector实现,使用前初始化G
 * V表示节点数,需要初始化
 * 时间复杂度:O(F*V^2)
 */
#define INF 0x3f3f3f3f
#define MAX_V 1005
typedef pair P;
struct edge
{
    int to,cap,cost,rev;
};
int V;
vector G[MAX_V];
int h[MAX_V];
int dist[MAX_V];
int prevv[MAX_V],preve[MAX_V];
void add_edge(int from,int to,int cap,int cost)
{
    G[from].push_back((edge)
    {
        to,cap,cost,G[to].size()
    });
    G[to].push_back((edge)
    {
        from,0,-cost,G[from].size()-1
    });
}
int min_cost_flow(int s,int t,int f)
{
    int res=0;
    fill(h,h+V,0);
    while(f>0)
    {
        priority_queue ,greater

>que; fill(dist,dist+V,INF); dist[s]=0; que.push(P(0,s)); while(!que.empty()) { P p=que.top(); que.pop(); int v=p.second; if(dist[v]0&&dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]) { dist[e.to]=dist[v]+e.cost+h[v]-h[e.to]; prevv[e.to]=v; preve[e.to]=i; que.push(P(dist[e.to],e.to)); } } } if(dist[t]==INF) { return -1; } for(int v=0; v



你可能感兴趣的:(整理模板,图论)