#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
struct node
{
int u,v,w,val,next,num;
}e[1111111];
int head[11111];
int dis[111111],vis[111111],pre[11111],path[111111];
int st,ed,top;
int n,m;
#define INF 0x3f3f3f3f
void add(int u,int v,int w,int val)
{
e[top].u=u;
e[top].v=v;
e[top].w=w;//费用
e[top].val=val;//容量
e[top].num=top;
e[top].next=head[u];
head[u]=top++;
}
int spfa()
{
queue<int>q;
q.push(st);
memset(pre,-1,sizeof pre);
memset(path,-1,sizeof path);
for(int i=1;i<=ed;i++)dis[i]=INF;
dis[st]=0;
memset(vis,0,sizeof vis);
vis[st]=1;
while(!q.empty())
{
int f=q.front();
q.pop();
vis[f]=0;
for(int i=head[f];i!=-1;i=e[i].next)
{
int v=e[i].v,w=e[i].w,val=e[i].val;
if(val&&dis[v]>dis[f]+w)
{
dis[v]=dis[f]+w;
pre[v]=f;
path[v]=e[i].num;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
}
}
if(dis[ed]!=INF)return 1;
else return 0;
}
int MIN_costflow()
{
int ans=0;
int maxflow=0;
while(spfa()==1)
{
int min1=INF;
for(int i=ed;i!=st;i=pre[i])
{
min1=min(min1,e[path[i]].val);
}
maxflow+=min1;
ans+=dis[ed]*min1;
for(int i=ed;i!=st;i=pre[i])
{
e[path[i]].val-=min1;
e[path[i]^1].val+=min1;
}
}
return ans;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
st=n+1,ed=n+2;
memset(head,-1,sizeof head);
top=0;
for(int i=0;i<m;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
add(x,y,w,1);
add(y,x,-w,0);
add(y,x,w,1);
add(x,y,-w,0);
}
add(st,1,0,2);
add(1,st,0,0);
add(n,ed,0,2);
add(ed,n,0,0);
//printf("ok");
printf("%d\n",MIN_costflow());
}
}
最小费用流 poj 2135
最新推荐文章于 2019-08-03 16:21:26 发布