最小费用最大流问题

orzorz.....我实在太弱啦!

今天问txl神犇我写的这算什么 被教育了一番只背板子不理解算法...

于是决定跪回去老实啃定义....

不过在那之前还是先把劳动成果放出来吧x

照理是模板题:

改了一改某位神犇的代码 看上去还是挺舒服的x

 

#pragma GCC optimize("O2")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<limits.h>
#include<ctime>
#define N 100001
typedef long long ll;
const int inf=0x3fffffff;
const int maxn=2017;
using namespace std;
inline int read()
{
    int f=1,x=0;char ch=getchar();
    while(ch>'9'|ch<'0')
    {
        if(ch=='-')
        f=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0')
    {
        x=(x<<3)+(x<<1)+ch-'0';
        ch=getchar();
    }
    return f*x;
}
int d[N],a[N];
bool inq[N],vis[N];
struct tsdl{
	int w,to,next,cost;
} edge[N*4];
int tot,head[N];
void add(int ui,int vi,int wi,int ci)
{
	edge[tot].next=head[ui];
	edge[tot].w=wi;
	edge[tot].to=vi; 
	edge[tot].cost=ci;
    head[ui]=tot++;
}
deque<int>q;
int n;
bool bfs(int s,int t)
{
    for (int i=0;i<=n;i++)
	d[i]=inf;
    memset(inq,0,sizeof(inq));
    d[t]=0,inq[t]=true;
	q.push_back(t);
    while (!q.empty())
	{
        int u=q.front();
		q.pop_front();
        inq[u]=false;
        for (int i=head[u];i!=-1;i=edge[i].next)
		{
            int v=edge[i].to;
            if (edge[i^1].w&&d[v]>d[u]-edge[i].cost)
		    {
                d[v]=d[u]-edge[i].cost;
                if (!inq[v])
		        {
                    inq[v]=true;
                    if (q.empty()||d[v]>=d[q.front()])
					q.push_back(v);
                    else q.push_front(v);
                }
            }
        }
    }
    return d[s]<d[0];
}
int dfs(int u,int f,int t)
{
    vis[u]=true;
    if (u==t||f==0)return f;
    int used=0;
    for (int i=head[u];i!=-1;i=edge[i].next)
		{
            int v=edge[i].to;
            if ((!vis[v])&&edge[i].w&&d[v]==d[u]-edge[i].cost)
		    {
                  int w=f-used;
                  w=dfs(v,min(edge[i].w,w),t);
                  edge[i].w-=w;
                  edge[i^1].w+=w;
                  used+=w;
            if (used==f)return used;
        }
    }
    return used;
}
int ans,res;
int main()
{
	memset(head,-1,sizeof(head));
    n=read();
	int m=read(),s=read(),t=read();
    for (int i=1;i<=m;i++)
    {
        int u=read(),v=read(),w=read(),c=read();
        add(u,v,w,c);
        add(v,u,0,-c);
    }
    while (bfs(s,t))
    {
        vis[t]=1;
        while (vis[t])
        {
            memset(vis,0,sizeof(vis));
            int flow=dfs(s,inf,t);
            res+=d[s]*flow;
            ans+=flow;
        }
    }
    printf("%d %d",ans,res);
    return 0;
}

 

posted @ 2017-09-12 09:48  a799091501  阅读(160)  评论(0编辑  收藏  举报