最小费用最大流模板:
该题注意的几个地方:
1.有重边;
2 3
1 2 1
1 2 2
1 2 3
3
2.无向图,正反方向均要加边。
因为此题是无向图,所以建边的时候如果建两条费用都是正的边的话,退流时无法修正费用。所以应该建4条边:
第一对:a->b cost 1b->a -cost 0第二对:b->a cost 1a->b -cost 03.数组要开4*(m+2)
View Code
/*Source CodeProblem: 2135 User: HEU_daoguangMemory: 1532K Time: 32MSLanguage: G++ Result: AcceptedSource Code*/#include#include #include #include #include #define V 10100#define E 1000100#define inf 99999999using namespace std;int vis[V];int dist[V];int pre[V];struct Edge{ int u,v,c,cost,next;}edge[E];int head[V],cnt;void init(){ cnt=0; memset(head,-1,sizeof(head));}void addedge(int u,int v,int c,int cost){ edge[cnt].u=u;edge[cnt].v=v;edge[cnt].cost=cost; edge[cnt].c=c;edge[cnt].next=head[u];head[u]=cnt++; edge[cnt].u=v;edge[cnt].v=u;edge[cnt].cost=-cost; edge[cnt].c=0;edge[cnt].next=head[v];head[v]=cnt++;}bool spfa(int begin,int end){ int u,v; queue q; for(int i=0;i<=end+2;i++){ pre[i]=-1; vis[i]=0; dist[i]=inf; } vis[begin]=1; dist[begin]=0; q.push(begin); while(!q.empty()){ u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=edge[i].next){ if(edge[i].c>0){ v=edge[i].v; if(dist[v]>dist[u]+edge[i].cost){ dist[v]=dist[u]+edge[i].cost; pre[v]=i; if(!vis[v]){ vis[v]=true; q.push(v); } } } } } return dist[end]!=inf;}int MCMF(int begin,int end){ int ans=0,flow; int flow_sum=0; while(spfa(begin,end)){ flow=inf; for(int i=pre[end];i!=-1;i=pre[edge[i].u]) if(edge[i].c #include #include #include #include #define V 10100#define E 1000100#define inf 99999999using namespace std;int vis[V];int dist[V];int pre[V];struct Edge{ int u,v,c,cost,next;}edge[E];int head[V],cnt;void init(){ cnt=0; memset(head,-1,sizeof(head));}void addedge(int u,int v,int c,int cost){ edge[cnt].u=u;edge[cnt].v=v;edge[cnt].cost=cost; edge[cnt].c=c;edge[cnt].next=head[u];head[u]=cnt++; edge[cnt].u=v;edge[cnt].v=u;edge[cnt].cost=-cost; edge[cnt].c=0;edge[cnt].next=head[v];head[v]=cnt++;}bool spfa(int begin,int end){ int u,v; queue q; for(int i=0;i<=end+2;i++){ pre[i]=-1; vis[i]=0; dist[i]=inf; } vis[begin]=1; dist[begin]=0; q.push(begin); while(!q.empty()){ u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=edge[i].next){ if(edge[i].c>0){ v=edge[i].v; if(dist[v]>dist[u]+edge[i].cost){ dist[v]=dist[u]+edge[i].cost; pre[v]=i; if(!vis[v]){ vis[v]=true; q.push(v); } } } } } return dist[end]!=inf;}int MCMF(int begin,int end){ int ans=0,flow; int flow_sum=0; while(spfa(begin,end)){ flow=inf; for(int i=pre[end];i!=-1;i=pre[edge[i].u]) if(edge[i].c