zoukankan      html  css  js  c++  java
  • bzoj3396 [Usaco2009 Jan]Total flow 水流

    Description

    Input

        第1行输入N,之后N行每行描述一条水管,前两个英文字母表示水管的两端(大小写字母是不一样的),后一个整数表示水管的流量,流量不会超过1000.

    Output

        一个整数,表示总流量.

    Sample Input

    5
    A B 3
    B C 3
    C D 5
    D Z 4
    B Z 6

    Sample Output

    3

    我完全不知道这题在讲什么……不就是网络流吗……为什么讲这么多

    A是源Z是汇,跑一遍网络流乱搞就AC了

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define S 1
    #define T 26
    #define inf 0x7fffffff
    using namespace std;
    struct edge{
    	int to,next,v;
    }e[50001];
    int n,cnt=1,ans;
    int head[10001];
    int h[10001];
    int q[10001];
    inline void ins(int u,int v,int w)
    {
    	e[++cnt].v=w;
    	e[cnt].to=v;
    	e[cnt].next=head[u];
    	head[u]=cnt;
    }
    inline void insert(int u,int v,int w)
    {
    	ins(u,v,w);
    	ins(v,u,0);
    }inline bool bfs()  
    {  
        memset(h,-1,sizeof(h));  
        int t=0,w=1;  
        q[1]=S;h[S]=0;  
        while (t<w)  
        {  
            int now=q[++t];  
            for (int j=head[now];j;j=e[j].next)  
            {  
                if (e[j].v&&h[e[j].to]==-1)  
                {  
                    q[++w]=e[j].to;  
                    h[e[j].to]=h[now]+1;  
                }  
            }  
        }  
        if (h[T]==-1) return 0;  
        return 1;  
    }  
    inline int dfs(int x,int f)  
    {  
        if (x==T||f==0) return f;  
        int w,used=0;  
        for (int i=head[x];i;i=e[i].next)  
        {  
            if (e[i].v&&h[e[i].to]==h[x]+1)  
            {  
                w=used;  
                w=dfs(e[i].to,min(e[i].v,f-used));  
                e[i].v-=w;  
                e[i^1].v+=w;  
                used+=w;  
                if (used==f) return f;  
            }  
        }  
        if (!used) h[x]==-1;  
        return used;  
    }  
    inline void dinic()  
    {while (bfs()) ans+=dfs(S,inf);}  
    int main()
    {
    	cin>>n;
    	for (int i=1;i<=n;i++)
    	{
    		char a,b;
    		int c;
    		cin>>a>>b>>c;
    		insert(a-'A'+1,b-'A'+1,c);
    	}
    	dinic();
    	cout<<ans;
    }


    ——by zhber,转载请注明来源
  • 相关阅读:
    函数对象中的prototype属性
    undefined和null的区别
    访问修饰符
    继承
    静态成员和实例成员的区别
    js模拟Trim()方法
    连接池的执行原理
    Javascript中的= =(等于)与= = =(全等于)区别
    数据库中创建约束
    KM算法入门
  • 原文地址:https://www.cnblogs.com/zhber/p/4036073.html
Copyright © 2011-2022 走看看