最小費用流

2021-07-24 13:46:05 字數 2687 閱讀 9885

單向圖

題目鏈結請點這裡

#include//每次找費用的最短路,更新殘留網路圖直到找不到最短路為止

#include//最大費用 權值取負值 結果取負值

#include

#include

#include

using

namespace

std;

const

int inf=0x3f3f3f3f;

struct node

node[1001000];

int head[1001000],cont,sumflow;

int vis[101000],dist[101000];

int pre[101000];

void init()

void add(int u,int v,int w,int cost)//建圖

}node[cont].u=u,node[cont].v=v;

node[cont].w=w,node[cont].cost=cost;

node[cont].next=head[u],head[u]=cont++;

node[cont].u=v,node[cont].v=u;

node[cont].w=0,node[cont].cost=-cost;//反向邊費用為負的

node[cont].next=head[v],head[v]=cont++;

}int spfa(int st,int ed)//尋找最短路

dist[st]=0;

vis[st]=1;

q.push(st);

while(!q.empty())}}

}if(dist[ed]==inf) return

0;//找不到最短路

return1;}

int mcmf(int st,int ed)

mincost+=dist[ed]*mins;//每次找到最短路後更新最小費用

flow+=mins;//更新最大流

}sumflow=flow;//最大流

return mincost;

}int main()

for(int i=0; iint a,b,c;

scanf("%d%d%d",&a,&b,&c);

add(a,b+n,1,c);

}int ans=mcmf(st,ed);//最小費用最大流

printf("%d\n",ans);

}return

0;}

雙向圖

題目鏈結

#include//每次找費用的最短路,更新殘留網路圖直到找不到最短路為止

#include//最大費用 權值取負值 結果取負值

#include

#include

#include

using

namespace

std;

const

int inf=0x3f3f3f3f;

struct node

node[1001000];

int head[1001000],cont,sumflow;

int vis[101000],dist[101000];

int pre[101000];

void init()

void add(int u,int v,int w,int cost)//建圖

return ;}}

node[cont].u=u,node[cont].v=v;

node[cont].w=w,node[cont].cost=cost;

node[cont].next=head[u],head[u]=cont++;

node[cont].u=v,node[cont].v=u;

node[cont].w=0,node[cont].cost=-cost;//反向邊費用為負的

node[cont].next=head[v],head[v]=cont++;

}int spfa(int st,int ed)//尋找最短路

dist[st]=0;

vis[st]=1;

q.push(st);

while(!q.empty())}}

}if(dist[ed]==inf) return

0;//找不到最短路

return1;}

int mcmf(int st,int ed)

mincost+=dist[ed]*mins;//每次找到最短路後更新最小費用

flow+=mins;//更新最大流

}sumflow=flow;//最大流

return mincost;

}int main()

for(int i=0; iint a,b,c;

scanf("%d%d%d",&a,&b,&c);//雙向邊

add(a,b+n,1,c);

add(b,a+n,1,c);

}int ans=mcmf(st,ed);//最小費用最大流

printf("case %d: ",++z);

if(sumflow!=n)

printf("no\n");

else

printf("%d\n",ans);

}return

0;}

最小費用流

include include define maxn 61 define maxv maxn maxn 2 1 define maxe maxv 5 define oo 2147483647 define min a,b a b b a define maxq maxe using namespa...

最小費用流

int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...

最小費用流

acm模版 最小費用流 o v e f init network g g.build v,e call g.mincost s,t flow g.flow cost g.cost 注意 spfa增廣,實際複雜度遠遠小於o v e define typef int type of flow defin...