码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1459

时间:2018-02-27 14:00:33      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:git   ret   har   mon   mil   soft   str   res   space   

由于有多个源点和汇点,就考虑把所有源点变为从一个总源点来供应,所有汇点汇到一个总汇点,再写一个Edmonds-Karp即可。

#include"cstdio"
#include"cctype"
#include"cstring"
#include"algorithm"
using namespace std;
int read()
{
    int c,x=0; while(!isdigit(c=getchar()));
    while(x=x*10+c-0,isdigit(c=getchar()));
    return x;
}
int n,nc,np,m,s,t,vis[102],pre[102],f[102][102];
int bfs()
{
    memset(vis,0,sizeof vis);
    memset(pre,0,sizeof pre);
    int q[102],l=0,r=0;
    vis[s]=1;
    q[r++]=s;
    while(l<r)
    {
        int fr=q[l++];
        for(int i=0;i<=t;i++)
            if(!vis[i] && f[fr][i])
            {
                q[r++]=i;
                vis[i]=1;
                pre[i]=fr;
                if(i==t) return 1;
            }
    }
    return 0;
}
int EK()
{
    int res=0;
    while(bfs())
    {
        int now=2e9;
        for(int i=t;i!=s;i=pre[i]) now=min(now,f[pre[i]][i]);
        for(int i=t;i!=s;i=pre[i])
        {
            f[pre[i]][i]-=now;
            f[i][pre[i]]+=now;
        }
        res+=now;
    }
    return res;
}
int main()
{
    while(~scanf("%d%d%d%d",&n,&np,&nc,&m))
    {
        memset(f,0,sizeof f);
        s=n; t=n+1;
        for(int i=1;i<=m;i++)
        {
            int u=read(),v=read(),c=read();
            f[u][v]=c;
        }
        for(int i=1;i<=np;i++)
        {
            int u=read(),p=read();
            f[s][u]=p;
        }
        for(int i=1;i<=nc;i++)
        {
            int v=read(),c=read();
            f[v][t]=c;
        }
        printf("%d\n",EK());
    }
    return 0;
}

 

poj 1459

标签:git   ret   har   mon   mil   soft   str   res   space   

原文地址:https://www.cnblogs.com/vertbird/p/8478293.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!