BZOJ 3396 水流

Posted on 2016-04-26 20:51  ziliuziliu  阅读(132)  评论(0编辑  收藏  举报

啊。。。vis要memset。。。。

dinic.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxv 1050
#define maxe 15500
#define inf 1000000007
using namespace std;
struct edge
{
    int v,f,nxt;
}e[maxe];
int n,nume=1,a,b,c,s,t,g[maxv],dis[maxv];
queue <int> q;
bool vis[maxv];
char ss[4];
void addedge(int u,int v,int w)
{
    e[++nume].v=v;
    e[nume].f=w;
    e[nume].nxt=g[u];
    g[u]=nume;
    e[++nume].v=u;
    e[nume].f=0;
    e[nume].nxt=g[v];
    g[v]=nume;
}
bool bfs()
{
    memset(dis,0,sizeof(dis));
    memset(vis,false,sizeof(vis));
    q.push(s);vis[s]=true;
    while (!q.empty())
    {
        int head=q.front();
        q.pop();
        for (int i=g[head];i;i=e[i].nxt)
        {
            int v=e[i].v;
            if ((vis[v]==false) && (e[i].f>0))
            {
                vis[v]=true;dis[v]=dis[head]+1;
                q.push(v);
            }
        }
    }
    if (dis[t]==0) return false;
    return true;
}
int dinic(int x,int low)
{
    if (x==t) return low;
    else
    {
        int ret=0;
        for (int i=g[x];low && i;i=e[i].nxt)
        {
            int v=e[i].v;
            if ((dis[v]==dis[x]+1) && (e[i].f>0))
            {
                int dd=dinic(v,min(low,e[i].f));
                low-=dd;ret+=dd;e[i].f-=dd;e[i^1].f+=dd;
            }
        }
        if (ret==0) dis[x]=0;
        return ret;
    }
}
int max_flow()
{
    int ret=0;
    while (bfs())
        ret+=dinic(s,inf);
    return ret;
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%s",ss);a=ss[0];
        scanf("%s",ss);b=ss[0];
        scanf("%d",&c);
        addedge(a,b,c);
    }
    s=65;t=90;
    printf("%d\n",max_flow());
    return 0;
}