#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 550
#define INF 99999999
int prev[maxn];
bool vis[maxn];
int head[maxn];
int ep,flow;
int Dist[maxn];
struct ele
{
int u;
int v;
int w;
int c;
int next;
}edge[200*maxn];
void Add(int u,int v,int w,int c)
{
edge[ep].u=u;
edge[ep].v=v;
edge[ep].w=w;
edge[ep].c=c;
edge[ep].next=head[u];
head[u]=ep++;
edge[ep].u=v;
edge[ep].v=u;
edge[ep].w=-w;
edge[ep].c=0;
edge[ep].next=head[v];
head[v]=ep++;
}
int spfa(int S,int E)
{
int i;
int v;
queue<int>Q;
int u;
for(i=0;i<maxn;i++)
{
Dist[i]=INF;
prev[i]=-1;
vis[i]=false;
}
vis[S]=true;
Dist[S]=0;
Q.push(S);
while(!Q.empty())
{
u=Q.front();
Q.pop();
vis[u]=false;
for(i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(edge[i].c&&Dist[u]+edge[i].w<Dist[v])
{
Dist[v]=Dist[u]+edge[i].w;
prev[v]=i;
if(!vis[v])//记录的为点
{
Q.push(v);
vis[v]=true;
}
}
}
}
if(Dist[E]==INF)
return 0;
return 1;
}
int EK(int S,int E)
{
int u;
int sum=0;
int temp;
while(spfa(S,E))
{
// printf("88888\n");
sum+=Dist[E];
temp=INF;
u=E;
while(u!=S)
{
if(temp>edge[prev[u]].c)
temp=edge[prev[u]].c;
u=edge[prev[u]].u;
}
flow+=temp;
u=E;
while(u!=S)
{
edge[prev[u]].c-=temp;
edge[prev[u]^1].c+=temp;
u=edge[prev[u]].u;
}
}
return sum;
}
int main()
{
int n,m;
int i;
int x,y,z;
while(scanf("%d%d",&n,&m)!=EOF)
{
ep=0;
memset(head,-1,sizeof(head));
flow=0;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
Add(x,n+y,z,1);
}
for(i=1;i<=n;i++)
{
Add(0,i,0,1);
Add(n+i,2*n+1,0,1);
}
int ans=EK(0,2*n+1);
if(flow==n)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}
最小费用最大流
原创
©著作权归作者所有:来自51CTO博客作者mb64e477779bdae的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
最小费用最大流——ZKW
对于最小费用最大流,我们的通常做法是EK+SPFA。...
km算法 #include 费用流 最大流 二分图 -
hdu 4067(最小费用最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4067思路:很神奇的建图,参考大牛的:如果人为添加t->s的边,那么图中所有顶点要满足的条件都是一样的了,我们以此为目的来建图。对于每条边,我们只有两种操作,要么保留要么删除,那么先假设两种操作都能满足条件,我们就可以选择花费小的操作来执行,最后再根据实际情况调整。首先不加入任何边,在添加或删除(不加入)边的过程中,对每个顶点v记录in[v]为其当前入度,out[v]为其出度,sum为当前的总花费。那么对于每条边,如果au,流量1,费用为b-a(如果删除这条边的费用)如果bv,流量1,费用为a
图论(网络流) #include #define ios 最小费用流 -
poj 3680(最小费用最大流)
题目链接:http://poj.org/problem?id=3680思路:因为N 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 444 8 #define MAXM 444444 9 #define inf 1que; 42 que.push(vs); 43 while(!que.empty()){ 44 int u=que.front(); 45 que.pop(); 46 mark[u]=fa...
图论(网络流) #include i++ #define ios