我是靠谱客的博主 纯真洋葱,这篇文章主要介绍网络吞吐量(network)题目分析,现在分享给大家,希望可以做个参考。

题目

这里写图片描述

分析

过一遍spfa,把从点1到其他每一个点的最短路求出来,
接着递归把所有最短路径上的路径保留,其他的删掉。
对于保留的路径作为网络流的边,流量为无穷大,对于每个点拆点两个点之间的流量为吞吐量。
跑个网络流。

复制代码
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <fstream> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> const long long maxlongint=2147483647000000; using namespace std; long long dis[2100],a[600][600],f[2000][2000],d[600000],tot; long long v[2100]; long long n,m,id; long long spfa() { long long i,j,l; dis[1]=0; d[1]=1; long long head=0,tail=1,k; while(head<tail) { head++; k=d[head]; v[k]=true; for(i=1;i<=n;i++) { if(a[k][i]>0) { if(a[k][i]+dis[k]<dis[i]) { dis[i]=dis[k]+a[k][i]; if(v[i]) { v[i]=false; d[++tail]=i; } } } } } } long long dg(long long x,long long v1) { if(x==n) return 0; v[x]=false; for(long long i=2;i<=n;i++) { if(a[x][i]<maxlongint) if(v1+a[x][i]==dis[i]) { f[x+n][i]=maxlongint; if(v[i]) dg(i,dis[i]); } } } bool bfs() { memset(dis,0,sizeof(dis)); long long i,j,l; d[1]=1; long long head=0,tail=1,k; while(head<tail) { k=d[++head]; for(i=2;i<=n+n;i++) { if(f[k][i]>0 && dis[i]==0) { dis[i]=dis[k]+1; d[++tail]=i; } } } if(dis[n+n]) return true; else return false; } long long aug(long long x,long long y) { if(x==n+n) return y; long long o; for(long long i=1;i<=n+n;i++) { if(f[x][i]>0 && dis[x]+1==dis[i]) { o=aug(i,min(y,f[x][i])); if(o>0) { f[x][i]-=o; f[i][x]+=o; return o; } } } return 0; } int main() { scanf("%lld%lld",&n,&m); long long i,j,k,l,x,y,z; for(i=1;i<=n;i++) { dis[i]=maxlongint; for(j=1;j<=n;j++) { a[i][j]=maxlongint; } } for(i=1;i<=m;i++) { scanf("%lld%lld%lld",&x,&y,&z); if(x>y) { j=x; x=y; y=j; } if(x==1) a[x][y]=min(a[x][y],z);else if(y==n) a[x][y]=min(a[x][y],z);else a[y][x]=a[x][y]=min(a[x][y],z); } memset(v,true,sizeof(v)); spfa(); memset(v,true,sizeof(v)); memset(f,0,sizeof(f)); dg(1,0); long long ans,t=99; memset(v,0,sizeof(v)); for(i=1;i<=n;i++) { scanf("%lld",&f[i][i+n]); if(i==1 || i==n) f[i][i+n]=maxlongint; } ans=0; while(bfs()) { ans+=aug(1,maxlongint); } cout<<ans; return 0; }

最后

以上就是纯真洋葱最近收集整理的关于网络吞吐量(network)题目分析的全部内容,更多相关网络吞吐量(network)题目分析内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部