记录编号 177898 评测结果 AAAAAAAAAA
题目名称 运输问题4 最终得分 100
用户昵称 Gravatar真红之蝶 是否通过 通过
代码语言 C++ 运行时间 0.011 s
提交时间 2015-08-12 20:58:36 内存使用 1.46 MiB
显示代码纯文本
/*在残量网络中有两类边:
1.剩余流量为零的边将其容量设为无穷,费用设为单位费用。
2.剩余流量不为零的边将其拆为两条边,一条容量设为剩余容量,费用设为0,另一条容量设为无穷,费用设为单位费用。*/
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,s,t,v[105],first[105],deep[105],dis[105],tat,tot=1,q[25000],head=0,tail=-1,ff,ww,pre[25000],ask;
struct bian
{
    int from,to,fare,next,flow;
}js[50000];
struct data
{
    int q,jvli;
    friend bool operator < (data a,data b)
    {
        return a.jvli>b.jvli;
    }
}cc,cd;
priority_queue<data>que;
int minc(int a,int b){return a<b?a:b;}
void add(int a,int b,int c,int d)
{
    js[++tot].from=a;
    js[tot].to=b;
    js[tot].flow=c;
    js[tot].fare=d;
    js[tot].next=first[a];
    first[a]=tot;
    js[++tot].from=b;
    js[tot].to=a;
    js[tot].flow=0;
    js[tot].fare=-d;
    js[tot].next=first[b];
    first[b]=tot;
}
/*int dfs(int x,int now_flow)
{
    if(x==n)
        return now_flow;
    int rest_flow=0;
    for(int i=first[x];i!=-1;i=js[i].next)
    {
        int u=js[i].to;
        if(js[i].flow>0&&deep[u]==deep[x]+1&&(rest_flow=dfs(u,minc(now_flow,js[i].flow))))
        {
            js[i].flow-=rest_flow;
            js[i^1].flow+=rest_flow;                                      
            return rest_flow;
        }
    }
    return 0;
}*/
/*bool bfs()
{
    head=0,tail=-1;
    q[++tail]=s;
    for(int i=1;i<=n;++i)
        deep[i]=-1;
    deep[s]=1;
    while(head<=tail)
    {
        int u=q[head++];
        for(int i=first[u];i!=-1;i=js[i].next)
        {
            int j=js[i].to;
            if(js[i].flow>0&&deep[j]==-1)
            {
                deep[j]=deep[u]+1;
                q[++tail]=j;
            }
        }
    }
    if(deep[t]>0)
        return 1;
    else
        return 0;
}*/
/*void dinic()
{
    int ans=0,ts=0;
    while(bfs())
        while(ts=dfs(1,0x7fffffff))
           ans+=ts;
    //printf("%d",ans);
}*/
bool spfa(int x)
{
    memset(dis,63,sizeof(dis));
    memset(v,0,sizeof(v));
    cc.q=x;
    cc.jvli=0;
    dis[x]=0;
    v[x]=1;
    que.push(cc);
    while(!que.empty())
    {
        cd=que.top();
        v[cd.q]=0;
        que.pop();
        for(int i=first[cd.q];i!=-1;i=js[i].next)
        {
            int u=js[i].to;
            if(js[i].flow>0&&dis[u]>dis[cd.q]+js[i].fare)
            {
                dis[u]=dis[cd.q]+js[i].fare;
                pre[u]=i;
                if(!v[u])
                {
                    v[u]=1;
                    cc.q=u;
                    cc.jvli=dis[u];
                    que.push(cc);
                }
            }
        }
    }
    if(dis[t]<100000000)
        return true;
    else
        return false;
}
void get_min()
{
    int minn=0x7fffffff;
    for(int i=pre[t];i;i=pre[js[i].from])
        minn=minc(minn,js[i].flow);  
    for(int i=pre[t];i;i=pre[js[i].from])
    {
        js[i].flow-=minn;
        js[i^1].flow+=minn;
        ask+=minn*js[i].fare;
    }
}
int main()
{
    freopen("maxflowd.in","r",stdin);
    freopen("maxflowd.out","w",stdout);
    memset(first,-1,sizeof(first));
    scanf("%d%d%d",&n,&s,&t);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        {
            scanf("%d%d",&ff,&ww);
            if(ww&&ff)
               add(i,j,ff,ww); 
        }
    //dinic();
    while(spfa(s))
        get_min();
    printf("%d",ask);
    getchar();getchar();getchar();getchar();
    return 0;
}