记录编号 431019 评测结果 AAAAAAAAAA
题目名称 运输问题4 最终得分 100
用户昵称 Gravatarwangxh 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2017-07-31 07:27:33 内存使用 1.08 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
struct tree{
    int v,d,next,cost;
}l[50050];
int n,s,t,lian[105],e=-1,pre[105],path[105],dis[105],flow,zz;
void bian(int,int,int,int);
bool bfs();
void dinic();
int main()
{
    //freopen("in.txt","r",stdin);
    freopen("maxflowd.in","r",stdin);
    freopen("maxflowd.out","w",stdout);
    scanf("%d%d%d",&n,&s,&t);
    memset(lian,-1,sizeof(lian));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            bian(i,j,x,y);
            bian(j,i,0,-y);
        }
    dinic();
    printf("%d",zz);
    //while(1);
    return 0;
}
void bian(int x,int y,int a,int b)
{
    e++;
    l[e].v=y;
    l[e].d=a;
    l[e].cost=b;
    l[e].next=lian[x];
    lian[x]=e;
}
bool bfs()
{
    memset(pre,-1,sizeof(pre));
    memset(dis,30,sizeof(dis));
    dis[s]=0;
    queue<int> que;
    que.push(s);
    //cout<<s<<endl;
    while(que.empty()==0)
    {
        int x=que.front();
        que.pop();
        for(int i=lian[x];i!=-1;i=l[i].next)
        {
            int v=l[i].v;
            if(l[i].d>0&&dis[x]+l[i].cost<dis[v])
            {
                dis[v]=dis[x]+l[i].cost;
                pre[v]=x;
                path[v]=i;
                //cout<<dis[v]<<" "<<v<<" "<<dis[x]+l[i]<<endl;
                que.push(v);
            }
        }
    }
    if(pre[t]==-1)
        return false;
    return true;
}
void dinic()
{
    while(bfs()==1)
    {
        int f=0x7fffffff;
        for(int i=t;i!=s;i=pre[i])
            if(l[path[i]].d<f)
                f=l[path[i]].d;
        //cout<<f<<endl;
        flow+=f;
        zz+=dis[t]*f;
        for(int i=t;i!=s;i=pre[i])
        {
            l[path[i]].d-=f;
            l[path[i]^1].d+=f;
        }
    }
}