zoukankan      html  css  js  c++  java
  • 11. 运输问题1

    ★★☆   输入文件:maxflowa.in   输出文件:maxflowa.out   简单对比

    时间限制:1 s   内存限制:128 MB

    【问题描述】
        一个工厂每天生产若干商品,需运输到销售部门进行销售。从产地到销地要经过某些城镇,有不同的路线可以行走,每条两城镇间的公路都有一定的流量限制。请你计算,在不考虑其它车辆使用公路的前提下,如何充分利用所有的公路,使产地运输到销地的商品最多,最多能运输多少商品。
    【输入格式】
    输入文件有若干行
    第一行,一个整数n,表示共有n个城市(2<=n<=100),产地是1号城市,销地是n号城市。
    下面有n行,每行有n个数字。第p行第q列的数字表示城镇p与城镇q之间有无公路连接。数字为0表示无,大于0表示有公路,且该数字表示该公路流量。
    【输出格式】
    输出文件有一行
    第一行,1个整数max,表示最大流量为max。
    【输入输出样例】
    输入文件名: maxflowa.in
    6
    0 4 8 0 0 0
    0 0 4 4 1 0
    0 0 0 2 2 0
    0 0 0 0 0 7
    0 0 0 6 0 9
    0 0 0 0 0 0
    输出文件名:maxflowa.out
    8
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    const int N = 1e4 + 10;
    const int Maxn = 99999999;
    
    int dis[N], head[N];
    bool vis[N];
    int n, S, T, now;
    struct Node{
    	int u, v, flow, cap, nxt;
    }E[N << 1];
    queue <int> Q; 
    
    inline int read()
    {
        int x = 0, f = 1;
        char c = getchar();
        while(c < '0' || c > '9')
        {
            if(c == '-')
                f = -1;
            c = getchar();
        }
        while(c >= '0' && c <= '9')
        {
            x = x * 10 + c - '0';
            c = getchar();
        }
        return x * f;
    }
    
    inline void add(int u,int v,int cap)
    {
    	E[now].v = v;
    	E[now].cap = cap;
    	E[now].flow = 0;
    	E[now].nxt = head[u];
    	head[u] = now ++;
    }
    
    inline bool bfs()
    {
    	for(int i = 1; i <= n; i ++)
    		dis[i] = -1;
    	dis[S] = 0;
    	Q.push(S);
    	while(!Q.empty())
    	{
    		int topp = Q.front();
    		vis[topp] = 0;
    		Q.pop();
    		for(int i = head[topp]; ~ i; i = E[i].nxt)
    		{
    			if(dis[E[i].v] == -1 && E[i].cap - E[i].flow > 0)
    			{
    				dis[E[i].v] = dis[topp] + 1;
    				if(!vis[E[i].v])
    				{
    					vis[E[i].v] = 1;
    					Q.push(E[i].v);
    				}
    			}
    		}
    	}
    	return dis[T] == -1 ? 0 : 1;
    }
    
    int dfs(int start, int minn)
    {
    	if(start == T || minn < 0)
    		return minn;
    	int ret = 0, flo;
    	for(int i = head[start]; ~ i; i = E[i].nxt)
    	{
    		if(dis[E[i].v] == dis[start] + 1 && E[i].cap - E[i].flow > 0)
    		{
    			flo = dfs(E[i].v, min(minn, E[i].cap - E[i].flow));
    			E[i].flow += flo;
    			E[i ^ 1].flow -= flo;
    			ret += flo;
    			minn -= flo;
    		}
    	}
    	return ret;
    }
    
    inline void Dinic()
    {
    	int answer = 0;
    	while(bfs())
    		answer += dfs(S, Maxn);
    	printf("%d",answer);
    }
    
    int main()
    {
    	freopen("maxflowa.in","r",stdin);
    	freopen("maxflowa.out","w",stdout);
    	n = read();
    	S = 1;
    	T = n;
    	for(int i = 1; i <= n ;i ++)
    		head[i] = -1;
    	for (int i = 1; i <= n; i ++)
    		for (int j = 1; j <= n; j ++)
    		{
    			int my = read();
    			if(my)
    			{
    				add(i, j, my);
    				add(j, i, 0);
    			}
    		}	
    	Dinic();
    	
    	return 0;
    }
    

      

  • 相关阅读:
    java——阶段性整理(方法的重载重写和一些关键字)
    设计模式——单例模式
    source
    set和setenv
    c++编译加执行脚本
    python脚本小记
    转义字符
    istream_iterator/ostream_iterator
    字符串替换程序 p324
    程序编译后运行时的内存分配
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7327615.html
Copyright © 2011-2022 走看看