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表示有公路,且该数字表示该公路流量。
第一行,一个整数n,表示共有n个城市(2<=n<=100),产地是1号城市,销地是n号城市。
下面有n行,每行有n个数字。第p行第q列的数字表示城镇p与城镇q之间有无公路连接。数字为0表示无,大于0表示有公路,且该数字表示该公路流量。
【输出格式】
输出文件有一行
第一行,1个整数max,表示最大流量为max。
第一行,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
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; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!