最小费用网络流,不含重边

2 篇文章 0 订阅
#include"stdio.h"
#include"string.h"
#include<queue>
using namespace std;
const int INF = 1<<30;
const int N = 10;
struct Node
{
int f, c;
};
bool isinQ[N];
int p[N];
int flow[N][N];
Node map[N][N];
int dis[N];
int minFlow = INF;
int n,m,s,t;
int f;
int sum;
void init()
{
memset(p, 0, sizeof(p));
memset(flow, 0, sizeof(flow));
memset(map, 0, sizeof(map));
minFlow = INF;
f = 0; 
s = 1;
t = n;
sum = 0;
}
int min(int x, int y)
{
return x<y?x:y;
}
void SPFA()
{
int u,v,i;
for(i = 0; i < N; i++)
dis[i] = INF;
dis[s] = 0;
queue<int>q;
memset(isinQ, 0, sizeof(isinQ));
isinQ[s] = 1;
q.push(s);
while(!q.empty())
{
u = q.front();q.pop();
isinQ[u] = 0;
for(v = 1; v <= n; v++)
{
if(dis[u] + map[u][v].c < dis[v] && map[u][v].f > flow[u][v])
{
dis[v] = dis[u] + map[u][v].c;
p[v] = u;
if(!isinQ[v])
{
q.push(v);
isinQ[v] = 1;
}
}
}
}
}


void Min_Cost_Max_Flow()
{
int u,v;
while(1)
{
SPFA();
if(dis[t] == INF) break;
minFlow = INF;
for(v = t; v != s; v = p[v])
{
minFlow = min(minFlow, map[p[v]][v].f - flow[p[v]][v]);
}
for(v = t; v != s; v = p[v])
{
flow[p[v]][v] += minFlow;
flow[v][p[v]] -= minFlow;
}
sum += dis[t]*minFlow; 
f += minFlow;
}
}


int main()
{
int i,j;
int u,v,ff,cc;
freopen("data.txt", "r", stdin);
while(scanf("%d%d", &n, &m) == 2)
{
init();
for(i = 1; i <= m; i++)
{
scanf("%d%d%d%d", &u, &v, &ff, &cc);
map[u][v].f= ff;
map[u][v].c = cc;
}
Min_Cost_Max_Flow();
printf("%d  %d\n", f, sum);
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值