最小费用最大流

2014-11-24 01:18:27 · 作者: · 浏览: 1
当我看到最小费用最大流问题这篇文章,才开始觉悟。于是做了如下实现。
/* 
    每次找出最短路径(该路径的单位费用和最小)记录该路径(next数组) 
    直到找不出这样一条路径(实际上是没有到达终点的路,因为图中的路是会不停的变动)。我们这里的是Distance[0]>=MAX 

*/  
  
#include  
using namespace std;  
#define MAX 1024  
  
int nodes,edges;//节点数和边数  
int capacity[MAX][MAX];//节点之间的流量  
int cost[MAX][MAX];//节点之间的单位费用  
  
int minCost=0;//统计最小费用  
int next[MAX];//为了记录最短路径  
  
int Distance[MAX];//表示每个节点到终点的费用  
inline int min(int a,int b)  
{  
    return a=0;i--)  
    {  
        for(j=0;j(Distance[i]+cost[j][i]))  
                {  
                    Distance[j]=Distance[i]+cost[j][i];  
                    next[j]=i;  
                }  
            }  
        }     
    }  
  
    for(i=nodes-1;i>=0;i--)  
    {  
        for(j=0;j(Distance[i]+cost[j][i]))  
                {  
                    Distance[j]=Distance[i]+cost[j][i];  
                    next[j]=i;  
                }  
        }     
    }     
}  
  
void minCostMaxFlow()  
{  
    while(1)  
    {  
        int i;  
        resetThePath();  
        if(Distance[0]>
=MAX)//没有最短路径 break; int increase=MAX;//本次最短路径中的流量 for(i=0;next[i]!=-1;i=next[i]) { increase=min(increase,capacity[i][next[i]]); } for(i=0;next[i]!=-1;i=next[i])//改变图的路径信息 { capacity[i][next[i]]-=increase; capacity[next[i]][i]+=increase; if(cost[next[i]][i]==MAX) cost[next[i]][i]=cost[i][next[i]]*(-1); if(!capacity[i][next[i]]) cost[i][next[i]]=MAX; } minCost+=Distance[0]*increase; } } void main() { while(1) { cin>>nodes>>edges; int i,j; for(i=0;i>firstnode>>secondnode>>capa>>cos; capacity[firstnode][secondnode]=capa; cost[firstnode][secondnode]=cos; } minCostMaxFlow(); cout<