最小费用流

合集下载

最小费用流

最小费用流
i j c P
s
a W
t
b
Edmonds和Karp
• 假设增广前s到u的距离为d(u), 增广后的费 用函数为w(e), 对于弧e=uv定义一个新的权 值w*(e) = w(e) + d(u) – d(v), 则对于任意s-t 路X, 有w*(X) = w(X) – d(x), 即对于权函数 w(e), w*(e), 从s出发的单源最短路树完全一 样 • 改进算法: 用w*(e)=w(e)+d(u)-d(v)作为权函 数计算单源最短路d*(x), 然后计算出真正的 新最短路
消圈定理
• 消圈定理: 流量为f的可行流x为流量为f的最 小费用流当且仅当x没有负费用增广圈 • 必要性显然,用反证法证明充分性。 • 假设存在不同的可行流x0使得它的费用比x 更低,则它们的差x1=x0-x是网络中的负费 用循环流。既然是循环流,x1一定可以分解 为至多m个非零圈流之和,则它们中至少有 一个圈是负费用的(有限个非负费用之和 仍是非负的),这个圈就是题目中非负增 广圈,矛盾
例1. Another Assignment Problem (SPOJ 684)
• 第i类工人有a(i)个, 第j类工作有b(j)个, 第i类 工人做第j类工作的代价是c(i,j). 用最小代价 把所有工人安排好位
目录
• 消圈算法及其正确性 • 连续最短路算法及其改进 • 应用
最小费用流
• 如下图, 弧上除了网络外还有一个费用值 • 总费用等于每条弧的流量与费用的乘积
残量网络
• 残量网络N’=(G’,c’,s,t) • c’的定义同不带费用的网络流问题 • 费用定义
– 正向弧费用为w(e) – 反向弧费用为-w(e)
连续最短路算法

图论专题小结:最小费用最大流算法

图论专题小结:最小费用最大流算法

图论专题小结:最小费用最大流算法一,给定流量F,求最小费用题意:网络中有两台计算机s,t。

现在每秒钟要从s到t传输大小为F的数据到t。

该网络中一共有N台计算机,其中有一些靠单向电缆相连接每条电缆用(from,to,cap,cost)表示从from发送给to,最大容量是cap,单位传输费用是cost。

问传输数据最小的花费是多少?解决最小费用流的一般思路是:每次都沿着最短路进行增广,增广一次之后累加本次增广的总费用,同时修改剩余的流量F,当F≤0时或dist[t]==INF时退出。

利用改进的Dijkstra算法求解(1)概述:题目要求在存在流量为F的前提下,总花费最少。

这类问题就是最小费用流问题。

该问题可以采用加入“势函数”后的Dijkstra算法解决。

因为对于每条边e=(u,v),有如下事实成立:h(v)≤h(u)+e.cost(其中h[u]表示s到u的最短距离)。

因此令dist[v]=dist[u]+e.cost+h[u]-h[v],。

那么所有的dist值必然大于等于0,这样就能用Dijkstra算法求解了。

下面代码中用了一个优先队列,每次优先出列dist值小的元素。

整个算法的时间复杂度是O(F*ElogV)(F是流量,E是边数,V是顶点数)。

1.#include<iostream>2.#include<algorithm>3.#include<string>4.#include<sstream>5.#include<set>6.#include<vector>7.#include<stack>8.#include<map>9.#include<queue>10.#include<deque>11.#include<cstdlib>12.#include<cstdio>13.#include<cstring>14.#include<cmath>15.#include<ctime>16.#include<functional>ing namespace std;18.19.#define N 100020.#define INF 10000000021.typedef pair<int, int>P;//first保存最短距离,second保存顶点的编号22.23.struct Edge24.{25.int to, cap, cost, rev;//终点,容量(指残量网络中的),费用,反向边编号26.Edge(int t, int c, int cc, int r) :to(t), cap(c), cost(cc), rev(r){}27.};28.int V;//顶点数29.vector<Edge>G[N];//图的邻接表30.int h[N];//顶点的势31.int dist[N];//最短距离32.int prevv[N];//最短路中的父结点33.int preve[N];//最短路中的父边34.35.void addedge(int from, int to, int cap, int cost)36.{37.G[from].push_back(Edge( to, cap, cost,G[to].size()));38.G[to].push_back(Edge( from, 0, -cost, G[from].size() - 1 ));39.}40.int min_cost_flow(int s, int t, int f)//返回最小费用41.{42.int res = 0;43.fill(h, h + V, 0);44.while (f>0)//f>0时还需要继续增广45.{46.priority_queue<P, vector<P>, greater<P> >q;47.fill(dist, dist + V, INF);//距离初始化为INF48.dist[s] = 0;49.q.push(P(0, s));50.while (!q.empty())51.{52.P p = q.top(); q.pop();53.int v = p.second;54.if (dist[v]<p.first)continue;//p.first是v入队列时候的值,dist[v]是目前的值,如果目前的更优,扔掉旧值55.for (int i = 0; i<G[v].size(); i++)56.{57.Edge&e = G[v][i];58.if (e.cap>0 && dist[e.to]>dist[v] + e.cost + h[v] - h[e.to])//松弛操作59.{60.dist[e.to] = dist[v] + e.cost + h[v] - h[e.to];61.prevv[e.to] = v;//更新父结点62.preve[e.to] = i;//更新父边编号63.q.push(P(dist[e.to], e.to));64.}65.}66.}67.if (dist[t] == INF)//如果dist[t]还是初始时候的INF,那么说明s-t不连通,不能再增广了68.return -1;69.for (int j = 0; j<V; j++)//更新h70.h[j] += dist[j];71.int d = f;72.for (int x = t; x != s; x = prevv[x])73. d = min(d, G[prevv[x]][preve[x]].cap);//从t出发沿着最短路返回s找可改进量74. f -= d;75.res += d*h[t];//h[t]表示最短距离的同时,也代表了这条最短路上的费用之和,乘以流量d即可得到本次增广所需的费用76.for (int x = t; x != s; x = prevv[x])77.{78.Edge&e = G[prevv[x]][preve[x]];79. e.cap -= d;//修改残量值80.G[x][e.rev].cap += d;81.}82.}83.return res;84.}85.86.int main()87.{88.freopen("t.txt", "r", stdin);89.int m;90.while (cin >> V >> m)91.{92.for (int i = 0; i<m; i++)93.{94.int from, to, cap, cost;95.cin >> from >> to >> cap >> cost;96.addedge(from, to, cap, cost);97.}98.int s, t, f;99.cin >> s >> t >> f;100.cout << min_cost_flow(s, t, f) << endl;101.}102.return 0;103.}104.二,网络输出最大流时,求出最小的费用这就是最小费用最大流问题:既要求出最大流,又要求出达到最大流时候的最小费用。

网络优化-7-最小费用流问题

网络优化-7-最小费用流问题
3
最小费用流问题
定义7.2 (容量-费用网络中的流(flow) 的定义同前一章)
流x的(总)费用定义为 c(x) cijxij 线性费用网络 (i,j)A
最小费用流问题就是在网络中寻找总费用最小的可行流.
mc(ix)n cix ji j s.t. x i j x j id i, i V( 7 .1 )
di >0:供应点(supply node)或源(source)、起始点或发货点 di <0:需求点(demand node)或汇(sink) 、终止点或吸收点
di =0:转运点(transshipment node)或平衡点、中间点
可以把L 0的网络转化为L=0的网络进行研究(思考?) 除非特别说明, 假设L=0,网络简记为N=(V,A,C,U,D).
大的s-t可行流y. 定义P的费用为 C(P) cij(x) (i,j)P
则当增广的流量为时 c (y ) c (x )• C (P )
为了获得最小费用流,我们希望沿费用最小的增广路对当前流x 进行增广,以最小的费用增加获得流值更大的s-t可行流y
16
7.2.2 最小费用路算法
定理7.2 设x为流值为v的最小费用流,P为关于x的从s到t的一条 最小费用增广路,且沿P所能增广的流量为 ,则增广后得到流 值为v+ 的最小费用流y.
(i,j) A
j : ( i,j) A j : (j,i) A
0 x i j u i,j ( i , j ) A ( 7 . 2 )
通常又称为转运问题(transshipment problem)或容量受限的 转运问题(capacitated transshipment problem).
如果当流量流过一条弧时,流出该弧的流量是进入该弧的流量 的一个线性函数,即流出该弧的流量是对进入该弧的流量按一 定比例进行放大或缩小的结果,则这样的流网络一般称为带增 益(或盈亏)的流网络(flow with gain network).

最大网络流最小费用流模型

最大网络流最小费用流模型


该函数满足:

(1)对于G的残流网络中的每一条边(u,v)有,h(u) h(v)+1; (2)h(t)=0。 G的残流网络中满足h(u) = h(v)+1的边(u,v)称为G的可推流边。
11
一般的预流推进算法
步骤0:构造初始预流flow: 对源顶点s的每条出边(s,v)令flow(s,v)=cap(s,v); 对其余边(u,v)令flow(u,v)=0。构造一有效的高度函数h。 步骤1:如果残量网络中不存在活顶点,则计算结束,已经得到最大流; 否则转步骤2。 步骤2:在网络中选取活顶点v。 如果存在顶点v的出边为可推流边,则选取一条这样的可推流边,并沿此边推流。 否则令h(v) = min{h(w)+1 | (v,w)是当前残流网络中的边},并转步骤1。
6



2 算法描述 最大流的增广路算法如下。该算法也常称作Ford Fulkerson算法。
template <class Graph, class Edge> class MAXFLOW { const Graph &G; int s, t,maxf; vector<int> wt; vector<Edge *> st; int ST(int v) const { return st[v]->other(v); } void augment(int s, int t) { int d = st[t]->capRto(t); for (int v = ST(t); v != s; v = ST(v)) if (st[v]->capRto(v) < d) d = st[v]->capRto(v); st[t]->addflowRto(t, d); maxf+=d; for ( v = ST(t); v != s; v = ST(v)) st[v]->addflowRto(v, d); } bool pfs(); public: MAXFLOW(const Graph &G, int s, int t,int &maxflow) : G(G), s(s), t(t), st(G.V()), wt(G.V()),maxf(0) { while (pfs()) augment(s, t); maxflow+=maxf;} };

最大流与最小费用流

最大流与最小费用流

c67 = 7 − P = 7 - 6 = 1
通过第1次修改,得到图3。
图3 返回步骤①,进行第2次修改。
次修改: 第2次修改 次修改 选定①—②—⑤—⑦,在这条路中,由 于 P = c25 = 3 ,所以,将 c12 改为2 , 25 改 c 为0,c57 改为5,c 21 、 52 、 75 改为3。修改后 c c 的图变为图4。
x12 + x13 + x14 = x57 + x67 = f
x12 + x32 x + x 23 13 x14 + x34 x + x 35 25 x36 + x 46 = x 23 + x 25 = x32 + x34 + x35 + x36 = x 46 + x65 = x56 + x57 + x56 = x65 + x67
所以取 P = c13 = 6 。
③在路①—③—⑥—⑦中,修改每一 条弧的容量
c13 = 6-P = 6-6 = 0
c36 = 7 − P = 7 - 6 = 1
c31 = 0 + P = 0 + 6 = 6
c63 = 0 + P = 0 + 6 = 6
c76 = 0 + P = 0 + 6 = 6
f = f 0 ≤ f max
(15)
使其代价最小,即
d=
( i , j )∈V
∑d
ij
xij = min
(16)
式中:d ij 指单位车辆数通过弧 (i, j )的代价。
图11 代价条件
图1 约束条件

最小费用流算法

最小费用流算法

最小费用流算法
最小费用流算法是一种简单的费用流算法,它旨在解决费用流问题,其中边权最小化。

它可以用于解决实际应用中的资源分配问题,表示流程网络(Flow Network)中使用费用
流算法利用边权来最小化流量路线。

最小费用流算法是一种基于增广路径的状态搜索算法。

它主要由两步组成:一是从源结点到汇结点的增广搜索;二是根据找到的增广路径调
整边权。

只要满足三个要求:1. 所有结点都有非负出度;2. 所有边都具有非负权;3.
所有结点都有相同的进入现金流,则最小费用流算法就可以得到最优解。

在最小费用流问题中,要求最小化所有边上的流入和流出时消耗的权重和,考虑到这
些约束,最小费用流算法具有一定的优越性。

首先,最小费用流算法可以在常数时间内完
成寻路,寻路的次数不会太多,其逻辑清晰,容易理解,对于每个结点,只需要搜索到可
达目的地的路径,而不需要考虑搜索路径的可行性。

由于最小费用流算法在查找算法中总
是具有优先权,因此它也可以改善整体优化算法,提供快速和可靠的结果。

最小费用流算法在实际应用中比较广泛,它可以用于解决很多实际问题,包括报价,
补给,物流等。

最小费用流算法可以帮助用户充分利用现有资源、实现最低开销,同时还
保持最大的流动性,从而降低建设成本和管理成本,使企业经营更加高效。

运筹学课件最小费用流问题概要

运筹学课件最小费用流问题概要

vt
) 2 , 4 , 3 (
(3,10,3)
v2
v3
第三次剩s
-1
-2
vt
2
6
3
v2
-3
v3
第三次调整网络流
v1
1 ( ) 4 , ,10
(5 ,5 ,1 )
vs
( 8,8 ,1)
(4,5,2)
vt
) 2 , ,4 4 (
(4,10,3)
( ,6) 0,2
v2
v3
v1
三、求解最小费用流的复合标号法
修正如下: 标号过程中,永久标号和临时标号一样 是可以改变的。对任一顶点而言,它有 可能反复变成T标号和P标号,顶点每次 变成P标号,标号过程都要从该顶点重新 开始。 所有顶点变为P标号,算法停止。
三、求解最小费用流的复合标号法
P(vs ) [0, ,0]
正向弧是非饱和弧: 反向弧是非零流弧:
(0 ,5 , 1)
( f ij ,cij ,bij )
(0,5,2)
1
0,
4)

vs (

6) 2, 0,
0, 8,
vt
) 2 , 4 , 0 (
1)
(0,10,3)
v2
v3
第一次剩余网络最短路
v1
1
D=4
4
vs
1
2
vt
2
6
3
v2
v3
第一次调整网络流
v1
(5,5,2)
0, ( , 0 1 4)
P(vs ) [0, ,0]
0, 8, 1)
vt
( 0 ) 2 , ,4
T (v2 ) [vs ,8,1] P

运筹学_最小费用流问题ppt课件

运筹学_最小费用流问题ppt课件

⑷在G中与这条最短路相应的可增广链μ上,
做 f (k) = fμ(k-1)θ
其中θ =min{μm+ in(cij
-
fi
(k-1)
j
),mμ-in
f
(k-1)
ij
}
此时 f (k)的流量为 W (f (k-1)) +θ , 若W (f (k-1)) +θ = v则停,
否则 令 f (k) 代替 f (k-1) ,返回⑵.
每条边用两条方向相反的有向边代替, 各边的权lij按如下
规则: 1. 当边 (vi , vj) ∈E, 令 lij =
dij 当 f ij < c ij +∞ 当 f ij = 0
( 其中+∞的意义是: 这条边已饱和, 不能再增大流量, 否则
要花费很高的代价, 实际无法实现, 因此权为+∞的边可从
网络中去掉. )
(10,0)
(7,5)
(10,4)
vs (8,5)
(5,5)
(2,0)
vt (0,0)
vs
1 1(-2) (2,6)
vt
-1
(2,2)
v2 (10,0) v3
v2 (10,3) v3
(c) f (1) W( f (1))=5
(d) L ( f (1) )
d (f (1)) = 5×1+5×2+ 5×1= 20
p160 - 166 6.12(c).
定义 已知网络G=(V, E, C, d), f 是G上的一个可行流, μ
为从v s到v t的(关于 f 的)可增广链, d (μ) = ∑ d i j - ∑ d i j
μ+
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(4,6,2)
v2
(2,3,0) (2,2,2)
再求v0到vn的最短增流路v0v2v3v1v4vn,路长为 14,可增加1单位的流值。(v3v1反向弧,同 最大流处理)
v1
(4,3,2)
v4 (2,5,3) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
b
17,3 (c )
c
(4)在 sbct 路中,每边的容量减 5, wsb ,如图 d。求最小费 用通路 sabct, 单位流费用和为 4 (2) 3 2 7, f0 3 , 边 ( c, t ) 饱 和。
s
0,
12, 4
a
13,6
0,
t
3, 2
11, 2
b
v1
(4,3,0)
v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
(单位运费,边容量,流值)
v1
(4,3,0)
v4 (2,5,0) vn (9,3,0) v5 (3,4,0)
(3,3,0)
s
0,
b
9, 4
8, 2
a
0,
t
0,
13, 6
9, 3
(e)
c
s
16
6
8
a
0
14
t
8
b
8
c
(f)
实际问题实例:一个工厂要将产品送 到火车站,可以有许多道路供其选择,在 不同路线上每吨货物的运费并不相同,而 且每条路线只能有限重量的货物运输,那 么要将w吨的产品从工厂送到火车站,用 什么方法可以使运费最少?
(4,6,0)
v2
(2,3,0) (2,2,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
v4 (2,5,0) vn (9,3,0) v5 (3,4,0)Leabharlann (3,3,0)v0
(2,2,0) v3
(1,1,0)
(4,6,0)
(4,6,3)
v2
(2,3,1) (2,2,2)
再求v0到vn的最短增流路v0v2v3v1v4vn,路长为 14,可增加1单位的流值。(v3v1反向弧,同 最大流处理)
v1
(4,3,3)
v4 (2,5,4) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,0) v3
(1,1,1)
(4,6,2)
v2
(2,3,0) (2,2,2)
再求v0到vn的最短增流路v0v2v3v1v4vn,路长为 14,可增加1单位的流值。(v3v1反向弧,同 最大流处理)
v1
(4,3,2)
v4 (2,5,3) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
v4 (2,5,0) vn (9,3,0) v5 (3,4,0)
(3,3,0)
v0
(2,2,0) v3
s
16,1
15, 4 11, 2
a
14,1
t
8, 2
13, 6
b
17,3
(a)
c
2) 在上述最小费用通路中的每边的 cij 中减去 11, 去掉边 (b, a ) , 作反向边 (a, b) ,且 c(a, b) f0 , w(a, b) 2 ,如图 b。
wsa wst 5, f0 3 , 在新网络中求最小费用通路 sat, 边 (a, t ) 饱和。
v2
(2,3,0) (2,2,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
v4 (2,5,1) vn (9,3,0) v5 (3,4,0)
(3,3,1)
v0
(2,2,1) v3
(1,1,1)
(4,6,0)
v2
(2,3,0) (2,2,0)
v1
(4,3,0)
v4 (2,5,1) vn (9,3,0) v5 (3,4,0)
(3,3,1)
v0
(2,2,1) v3
(1,1,1)
(4,6,0)
v2
(2,3,0) (2,2,0)
再求v0到vn的最短增流路v0v1v4vn,路长为9, 可增加2单位的流值。
v1
(4,3,0)
v4 (2,5,1) vn (9,3,0) v5 (3,4,0)
(4,6,2)
v2
(2,3,0) (2,2,2)
再求v0到vn的最短增流路v0v2v3v1v4vn,路长为 14,可增加1单位的流值。(v3v1反向弧,同 最大流处理)
v1
(4,3,3)
v4 (2,5,4) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,0) v3
(1,1,1)
0 fij uij , (i, j) A .
注:(1)如果 v( f ) 最大流 v( f max ) ,则本问题就是最小费用最 大流问题。 (2)如果 v( f ) v( f max ) ,则本问题无解。
求最小费用流的算法—迭代法 这里所介绍的求最小费用流的方法叫做迭代法。 这个方法是由 Busacker 和 Gowan 在 1961 年提出的。其主要步骤如下: (i)求出从发点到收点的最小费用通路 P( s, t ) , 记该通路的边集 合为 E ( P ) 。 (ii)对 P( s, t ) 分配最大可能的流量: f0 min{c( x, y) | ( x, y) E( P)}; 对所有的 ( x, y) E ( P) ,令 c( x, y) c( x, y) f0 ; 对 P( s, t ) 上的饱和边, 其单位流费用相应改为 , 且当 x 或 y s 或 t 时,将该 P( s, t ) 上的饱和边 ( x, y ) 变为反向边 ( y , x ) 。令 c( y, x) f0 , w( y, x) w( x, y) (iii)在这样构成的新网络中,重复上述步骤(i),(ii),直到从发 点到收点的全部流量等于 为止(或者再也找不到从 s 到 t 的最小 费用道路) 。此时为最小费用最大流。
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
(4,6,2)
v2
(2,3,0) (2,2,2)
再求v0到vn的最短增流路v0v2v5vn,路长为9, 可增加2单位的流值。
v1
(4,3,2)
v4 (2,5,3) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
(4,6,2)
v2
(2,3,0) (2,2,2)
再求v0到vn的最短增流路v0v2v3v1v4vn,路长为 14,可增加1单位的流值。(v3v1反向弧,同 最大流处理)
v1
(4,3,2)
v4 (2,5,3) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
例 求下图网络中的最小费用流。图中每边上第一个数字是容量 c(i , j ) cij ,第二个数字是单位流费用 w(i, j) wij
s
16,1
15, 4 11, 2
a
14,1
t
8, 2
13, 6
b
17,3
c
解: (1)求 s 到 t 的最小费用通路 sbat,如图 a。单位费用和 wsb wba wat 1 2 1 4 。 本路径中可分配的最大流 f 0 11。边 (b, a ) 饱和。
(4,6,0)
v2
(2,3,0) (2,2,0)
再求v0到vn的最短增流路v0v1v4vn,路长为9, 可增加2单位的流值。
v1
(4,3,2)
v4 (2,5,3) vn (9,3,0) v5 (3,4,0)
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
(4,6,0)
v2
(2,3,0) (2,2,0)
12,3
(d )
c
(5)在 sabct 路中,每边的容量减 3, wsb ,如图 e。在 e 中 再也找不到 s 到 t 的最小费用通路,算法结束。
s
0,
9, 4
8, 2
a
0,
t
0,
13, 6
b
9, 3
c
(e)
综合以上结果,网络中流的分配如图 f。 于是从 s 到 t 的流为: Val f 11 3 5 3 22 最小费用为: 6 4 14 1 16 1 8 2 8 2 8 3 0 6 110
最小费用最大流
前面介绍了一个网络上最大流的算法, 但是还没有考虑到网络 上流的费用问题,在许多实际问题中,费用的因素很重要。例如, 在运输问题中, 人们总是希望在完成运输任务的同时, 寻求一个使 总的运输费用最小的运输方案。 这就是下面要介绍的最小费用流问 题。 在运输网络 N (V , E, c, s, t ) 中,设 w(i, j ) 、 c(i, j ) 、 f (i, j ) 分 别表示边 (i, j ) 的单位流费用、容量和流量, Val f 。所谓最小 费用流问题就是从发点到收点怎样以最小费用输送一已知量为 Val f 的总流量。
相关文档
最新文档