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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#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;
}

  

posted @   ioioioioioio  阅读(185)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示