「网络流浅谈」最大流的应用

更好的阅读体验

二分图匹配

考虑如何将二分图匹配问题,转化为流网络。设置 1 1 1 个汇点和源点,从源点向二分图一侧的每一个点连边,从另一侧向汇点连边,边权均为 1 1 1,二分图中的边也全部加入,权值设为 1 1 1。这样,二分图的最大匹配等于流网络的最大流。

P2756 飞行员配对方案问题

题意:给定 1 1 1 个二分图,求最大匹配。

匈牙利算法是可以求二分图最大匹配的,不过太慢了。不妨,使用上述的方式建立出流网络,并使用 Dinic 求解出该网络的最大流即可。

举个例子:左图为样例的二分图,而右图为建立的流网络。

浅析流网络最大流与二分图最大匹配的相等性:

对于网络流的题目,只需要考虑对于任意的一个最大匹配,都能对应到一个可行流;而对于任意一个可行流都能对应到一个最大匹配。

对于任意的一个最大匹配,都能对应到一个可行流:若选择边 E 1 , E 2 , … , E k E_1,E_2, \dots ,E_k E1,E2,,Ek,则可行流中的这些边均为 1 1 1,且令这些边左端的顶点分别为 V 1 , V 2 , … , V t V_1,V_2,\dots,V_t V1,V2,,Vt,右端的为 V 1 ′ , V 2 ′ , … , V t ′ V'_1,V'_2,\dots, V'_t V1,V2,,Vt,则可行流的 s → V i s\rightarrow V_i sVi 这些边均为 1 1 1 V i ′ → t V'_i\rightarrow t Vit 这些边也均为 1 1 1。由于匹配不存在 2 2 2 条边有公共顶点,所以一定满足容量限制与流量守恒。

对于任意的一个可行流,都能对应到一个最大匹配:可行流中流量为 1 1 1 的没有 s s s t t t 的边即为最大匹配,由于流量守恒,最多有 1 1 1 条边流向一个点,所以满足对于任意 2 2 2 条边,都不存在公共点。

故,只需要用 Dinic 跑一遍最大流即可,输出方案就是找出所有反向边流量为 1 1 1(或正向边流量为 0 0 0)的边即可。

注意:二分图下的 Dinic 算法极为特殊,时间复杂度为 O ( n 2 n ) O(n^2\sqrt n) O(n2n )

#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;const int N = 1e2 + 10, M = 1e5 + 10;int n, m, s, t;
int h[N], e[M], ne[M], f[M], idx;
int d[N], cur[N];void add(int a, int b, int c) {e[idx] = b, ne[idx] = h[a], f[idx] = c, h[a] = idx ++;e[idx] = a, ne[idx] = h[b], f[idx] = 0, h[b] = idx ++;
}
bool bfs() {memset(d, -1, sizeof d);queue<int> q;q.emplace(s), cur[s] = h[s], d[s] = 0;while (q.size()) {auto u = q.front();q.pop();for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (d[j] == -1 && f[i]) {d[j] = d[u] + 1, cur[j] = h[j];if (j == t) return 1;q.emplace(j);}}}return 0;
}
int find(int u, int lim) {if (u == t) return lim;int flow = 0;for (int i = cur[u]; ~i && flow < lim; i = ne[i]) {int j = e[i];if (d[j] == d[u] + 1 && f[i]) {int tmp = find(j, min(lim - flow, f[i]));if (!tmp) d[j] = -1;f[i] -= tmp, f[i ^ 1] += tmp, flow += tmp;}}return flow;
}
int dinic() {int res = 0, flow;while (bfs()) while (flow = find(s, 1e18)) res += flow;return res;
}signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);memset(h, -1, sizeof h);cin >> m >> n;s = 0, t = n + 1;int u, v;while (cin >> u >> v && u != -1) {add(u, v, 1);}for (int i = 1; i <= m; i ++)add(s, i, 1);for (int i = m + 1; i <= n; i ++)add(i, t, 1);cout << dinic() << endl;for (int i = 0; i < idx; i += 2)if (e[i] != t && e[i ^ 1] != s && !f[i])cout << e[i ^ 1] << " " << e[i] << endl;return 0;
}
习题

P3254 圆桌问题,与原建图方式有略微差异。

参考代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;const int N = 5e2 + 10, M = 1e5 + 10;int m, n, s, t;
int a[N], b[N];
int h[N], e[M], f[M], ne[M], idx;
int d[N], cur[N];void add(int a, int b, int c) {e[idx] = b, ne[idx] = h[a], f[idx] = c, h[a] = idx ++;e[idx] = a, ne[idx] = h[b], f[idx] = 0, h[b] = idx ++;
}
bool bfs() {memset(d, -1, sizeof d);queue<int> q;q.emplace(s), d[s] = 0, cur[s] = h[s];while (q.size()) {int u = q.front();q.pop();for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (d[j] == -1 && f[i]) {d[j] = d[u] + 1;cur[j] = h[j];if (j == t) return 1;q.emplace(j);}}}return 0;
}
int find(int u, int lim) {if (u == t) return lim;int flow = 0;for (int i = cur[u]; ~i && flow < lim; i = ne[i]) {cur[u] = i;int j = e[i];if (d[j] == d[u] + 1 && f[i]) {int tmp = find(j, min(lim - flow, f[i]));if (!tmp) d[j] = -1;f[i] -= tmp, f[i ^ 1] += tmp, flow += tmp;}}return flow;
}
int dinic() {int res = 0, flow;while (bfs()) while (flow = find(s, 1e18)) res += flow;return res;
}signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);memset(h, -1, sizeof h);cin >> m >> n;s = 0, t = n + m + 1;int tot = 0;for (int i = 1; i <= m; i ++)cin >> a[i], add(s, i, a[i]), tot += a[i];for (int i = 1; i <= n; i ++)cin >> b[i], add(i + m, t, b[i]);for (int i = 1; i <= m; i ++)for (int j = m + 1; j <= n + m; j ++)add(i, j, 1);if (dinic() == tot) {cout << 1 << endl;std::vector<vector<int>> way(m + 1);for (int i = 0; i < idx; i += 2)if (e[i] != t && e[i ^ 1] != s && !f[i])way[e[i ^ 1]].emplace_back(e[i] - m);for (int i = 1; i <= m; i ++) {for (auto v : way[i])cout << v << " ";cout << endl;}} else {cout << 0 << endl;}return 0;
}

多源汇最大流

本质上只不过是源点不是 1 1 1 个,汇点也不是 1 1 1 个了,那么其实只需要再设一个超级源点连向所有源点,边权为 + ∞ +\infty +,表示向这些源点可以流任意多流量,也就是说从这些源点可以流出任意多流量;同样的,从每一个汇点向超级汇点连一条 + ∞ +\infty + 的边,表示这些汇点可以流向超级汇点任意多流量,也就是说这些汇点都可以接纳任意多的流量。

这样的新流网络的最大流就是源网络的最大流,所以只需要对于新网络跑一遍 Dinic 即可。

习题

AcWing 2234. 多源汇最大流,模版题

参考代码
#include <iostream>
#include <cstring>
#include <queue>
#define int long longusing namespace std;typedef pair<int, int> PII;const int SIZE = 5e5 + 10;int N, M, Sc, Tc, S, T;
int h[SIZE], e[SIZE], ne[SIZE], f[SIZE], idx;
int D[SIZE], Current[SIZE];void add(int a, int b, int c) {e[idx] = b, ne[idx] = h[a], f[idx] = c, h[a] = idx ++;e[idx] = a, ne[idx] = h[b], f[idx] = 0, h[b] = idx ++;
}bool BFS() {memset(D, -1, sizeof D);queue<int> Q;Q.push(S), D[S] = 0, Current[S] = h[S];while (Q.size()) {int u = Q.front();Q.pop();for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (D[j] == -1 && f[i]) {D[j] = D[u] + 1;Current[j] = h[j];if (j == T) return true;Q.push(j);}}}return false;
}int Find(int u, int limit) {if (u == T) return limit;int flow = 0;for (int i = Current[u]; ~i && flow < limit; i = ne[i]) {Current[u] = i;int j = e[i];if (D[j] == D[u] + 1 && f[i]) {int T = Find(j, min(f[i], limit - flow));if (!T) D[j] = -1;f[i] -= T, f[i ^ 1] += T, flow += T;}}return flow;
}int Dinic() {int Result = 0, flow;while (BFS()) while (flow = Find(S, 1e18)) Result += flow;return Result;
}signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);memset(h, -1, sizeof h);cin >> N >> M >> Sc >> Tc;S = 0, T = N + 1;while (Sc --) {int u;cin >> u;add(S, u, 1e18);}while (Tc --) {int u;cin >> u;add(u, T, 1e18);}while (M --) {int a, b, c;cin >> a >> b >> c;add(a, b, c);}cout << Dinic() << endl;return 0;
}

关键边

POJ3204 Ikki’s Story I - Road Reconstruction

题意:给定 1 1 1 个流网络,求有多少条边,满足增加该边边权后能使最大流增加。

考虑一条边满足什么条件使得增加容量后会使得最大流增加,回顾求最大流的过程:每一次在残留网络中找增广路径,并加到最大流中。

那么,如果容量增加后,最大流增加,那么必然是增加流量后产生 1 1 1 条增广路径。所以,对于每一条边 ( u , v ) (u,v) (u,v),只需要判断是否存在 1 1 1 条增广路径 s → u s\rightarrow u su 以及 1 1 1 增广路径 v → t v\rightarrow t vt。判断的方法就是在最大流的残留网络中 DFS,记录每次走 > 0 >0 >0 的边能到达那些点即可。

#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;const int N = 5e2 + 10, M = 2e4 + 10;int n, m, s, t;
int h[N], e[M], ne[M], f[M], idx;
int d[N], cur[N], vis[2][N];void add(int a, int b, int c) {e[idx] = b, ne[idx] = h[a], f[idx] = c, h[a] = idx ++;e[idx] = a, ne[idx] = h[b], f[idx] = 0, h[b] = idx ++;
}
bool bfs() {memset(d, -1, sizeof d);queue<int> q;q.emplace(s), d[s] = 0, cur[s] = h[s];while (q.size()) {int u = q.front();q.pop();for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (d[j] == -1 && f[i]) {d[j] = d[u] + 1, cur[j] = h[j];if (j == t) return 1;q.emplace(j);}}}return 0;
}
int find(int u, int lim) {if (u == t) return lim;int flow = 0;for (int i = cur[u]; ~i && flow < lim; i = ne[i]) {cur[u] = i;int j = e[i];if (d[j] == d[u] + 1 && f[i]) {int tmp = find(j, min(lim - flow, f[i]));if (!tmp) d[j] = -1;f[i] -= tmp, f[i ^ 1] += tmp, flow += tmp;}}return flow;
}
int dinic() {int res = 0, flow;while (bfs()) while (flow = find(s, 1e18)) res += flow;return res;
}
void dfs(int u, int k) {vis[k][u] = 1;for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (!vis[k][j] && f[i ^ k])dfs(j, k);}
}signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);memset(h, -1, sizeof h);cin >> n >> m;s = 0, t = n - 1;while (m --) {int u, v, w;cin >> u >> v >> w;add(u, v, w);}dinic();dfs(s, 0), dfs(t, 1);int res = 0;for (int i = 0; i < idx; i += 2)if (vis[0][e[i ^ 1]] && vis[1][e[i]])res ++;cout << res << endl;return 0;
}

拆点

POJ3281 Dining

题意:有 n n n 头奶牛, F F F 个食物和 D D D 个饮料,每头奶牛可以吃某些食物和饮料,但都只能吃食物和饮料各一个。求最多能满足多少头奶牛。(三分图匹配

考虑继续使用类似二分图的建网络流的方式,举个例子:

不过,这样真的能够求出最终的答案吗?答案是否定的。

考虑局部的这样一个位置,最大流得到话会流出 2 2 2 的,也就是这个奶牛会贡献 2 2 2,而应该是 1 1 1

所以,就要拆点了!

通过,流量守恒,就可以使得通过每一个点的流量最多为 $1$,也就满足了题意。
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;const int N = 4e2 + 10, M = 1e5 + 10;int n, m, k, s, t;
int h[N], e[M], ne[M], f[M], idx;
int d[N], cur[N];void add(int a, int b, int c) {e[idx] = b, ne[idx] = h[a], f[idx] = c, h[a] = idx ++;e[idx] = a, ne[idx] = h[b], f[idx] = 0, h[b] = idx ++;
}
bool bfs() {memset(d, -1, sizeof d);queue<int> q;q.emplace(s), d[s] = 0, cur[s] = h[s];while (q.size()) {int u = q.front();q.pop();for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (d[j] == -1 && f[i]) {d[j] = d[u] + 1, cur[j] = h[j];if (j == t) return 1;q.emplace(j);}}}return 0;
}
int find(int u, int lim) {if (u == t) return lim;int flow = 0;for (int i = cur[u]; ~i && flow < lim; i = ne[i]) {cur[u] = i;int j = e[i];if (d[j] == d[u] + 1 && f[i]) {int tmp = find(j, min(lim - flow, f[i]));if (!tmp) d[j] = -1;f[i] -= tmp, f[i ^ 1] += tmp, flow += tmp;}}return flow;
}
int dinic() {int res = 0, flow;while (bfs()) while (flow = find(s, 1e18)) res += flow;return res;
}signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);memset(h, -1, sizeof h);cin >> n >> m >> k;s = 0, t = n * 2 + m + k + 1;for (int i = 1; i <= n; i ++) {int cf, cd, x;cin >> cf >> cd;for (int j = 1; j <= cf; j ++)cin >> x, add(x, i + m, 1);for (int j = 1; j <= cd; j ++)cin >> x, add(i + m + n, x + m + n + n, 1);}for (int i = 1; i <= m; i ++)add(s, i, 1);for (int i = m + n * 2 + 1; i < t; i ++)add(i, t, 1);for (int i = m + 1; i <= m + n; i ++)add(i, i + n, 1);cout << dinic() << endl;return 0;
}
习题

P2766 最长不下降子序列问题

参考代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;const int N = 1e3 + 10, M = 4e5 + 10;int n, s, t;
int a[N], dp[N];
int h[N], e[M], ne[M], f[M], idx;
int d[N], cur[N];
void add(int a, int b, int c) {e[idx] = b, ne[idx] = h[a], f[idx] = c, h[a] = idx ++;e[idx] = a, ne[idx] = h[b], f[idx] = 0, h[b] = idx ++;
}
bool bfs() {memset(d, -1, sizeof d);queue<int> q;q.emplace(s), d[s] = 0, cur[s] = h[s];while (q.size()) {int u = q.front();q.pop();for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (d[j] == -1 && f[i]) {d[j] = d[u] + 1, cur[j] = h[j];if (j == t) return 1;q.emplace(j);}}}return 0;
}
int find(int u, int lim) {if (u == t) return lim;int flow = 0;for (int i = cur[u]; ~i && flow < lim; i = ne[i]) {cur[u] = i;int j = e[i];if (d[j] == d[u] + 1 && f[i]) {int tmp = find(j, min(lim - flow, f[i]));if (!tmp) d[j] = -1;f[i] -= tmp, f[i ^ 1] += tmp, flow += tmp;}}return flow;
}
int dinic() {int res = 0, flow;while (bfs()) while (flow = find(s, 1e18)) res += flow;return res;
}signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);memset(h, -1, sizeof h);cin >> n;for (int i = 1; i <= n; i ++)cin >> a[i];s = 0, t = 2 * n + 1;for (int i = 1; i <= n; i ++) {dp[i] = 1, add(i, i + n, 1);std::vector<int> opt;for (int j = 1; j < i; j ++)if (a[j] <= a[i] && dp[j] + 1 > dp[i])opt.clear(), opt.emplace_back(j), dp[i] = dp[j] + 1;else if (a[j] <= a[i] && dp[j] + 1 == dp[i])opt.emplace_back(j);for (auto v : opt)add(n + v, i, 1);}int res = 0;for (int i = 1; i <= n; i ++)res = max(res, dp[i]);cout << res << endl;for (int i = 1; i <= n; i ++) {if (dp[i] == res)add(i + n, t, 1);if (dp[i] == 1)add(s, i, 1);}res = dinic();cout << res << endl;for (int i = 0; i < idx; i += 2) {if (e[i ^ 1] == 1 && e[i] == 1 + n || e[i ^ 1] == 1 + n && e[i] == t || e[i ^ 1] == s && e[i] == 1)f[i] = 1e18;else if (e[i ^ 1] == n && e[i] == n + n || e[i ^ 1] == n + n && e[i] == t || e[i ^ 1] == s && e[i] == n)f[i] = 1e18;}res += dinic();cout << min(res, n) << endl;return 0;
}

POJ3498 March of the Penguins

参考代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;const int N = 2e2 + 10, M = 2e4 + 10;int n, s, t;
double ld;
int h[N], e[M], ne[M], f[M], idx;
int d[N], cur[N];
struct Node {int x, y;int tot, cnt;double operator- (const Node &tmp)const {int a = x - tmp.x, b = y - tmp.y;return sqrt(a * a * 1.0 + b * b * 1.0);}
}pg[N];
void add(int a, int b, int c) {e[idx] = b, ne[idx] = h[a], f[idx] = c, h[a] = idx ++;e[idx] = a, ne[idx] = h[b], f[idx] = 0, h[b] = idx ++;
}
bool bfs() {memset(d, -1, sizeof d);queue<int> q;q.emplace(s), d[s] = 0, cur[s] = h[s];while (q.size()) {int u = q.front();q.pop();for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (d[j] == -1 && f[i]) {d[j] = d[u] + 1, cur[j] = h[j];if (j == t) return 1;q.emplace(j);}}}return 0;
}
int find(int u, int lim) {if (u == t) return lim;int flow = 0;for (int i = cur[u]; ~i && flow < lim; i = ne[i]) {cur[u] = i;int j = e[i];if (d[j] == d[u] + 1 && f[i]) {int tmp = find(j, min(lim - flow, f[i]));if (!tmp) d[j] = -1;f[i] -= tmp, f[i ^ 1] += tmp, flow += tmp;}}return flow;
}
int dinic() {int res = 0, flow;while (bfs()) while (flow = find(s, 1e18)) res += flow;return res;
}void solve() {cin >> n >> ld;int sum = 0;for (int i = 1; i <= n; i ++)cin >> pg[i].x >> pg[i].y >> pg[i].tot >> pg[i].cnt, sum += pg[i].tot;s = 0;std::vector<int> res;for (t = 1; t <= n; t ++) {memset(h, -1, sizeof h);idx = 0;for (int i = 1; i <= n; i ++) {add(s, i, pg[i].tot), add(i, i + n, pg[i].cnt);for (int j = 1; j <= n; j ++)if (i != j && pg[j] - pg[i] <= ld)add(i + n, j, 1e18);}if (dinic() == sum)res.emplace_back(t);}if (res.empty())cout << -1 << endl;else {for (auto v : res)cout << v - 1 << " ";cout << endl;}
}signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int dt;cin >> dt;while (dt --)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第1章】SpringBoot入门

文章目录 前言一、版本要求1. SpringBoot版本2. 其他2.1 System Requirements2.2 Servlet Containers2.3 GraalVM Native Images 3. 版本定型 二、新建工程1.IDEA创建 ( 推荐 ) \color{#00FF00}{(推荐)} (推荐)2. 官方创建 三、第一个SpringBoot程序1. 引入web2. 启动类3. 启动…

Edge浏览器:重新定义现代网页浏览

引言 - Edge的起源与重生 Edge浏览器&#xff0c;作为Microsoft Windows标志性的互联网窗口&#xff0c;源起于1995年的Internet Explorer。在网络发展的浪潮中&#xff0c;IE曾是无可争议的霸主&#xff0c;但随着技术革新与用户需求的演变&#xff0c;它面临的竞争日益激烈。…

用这8种方法在海外媒体推广发稿平台上获得突破-华媒舍

在今天的数字时代&#xff0c;海外媒体推广发稿平台已经成为了许多机构和个人宣传和推广的有效途径。如何在这些平台上获得突破并吸引更多的关注是一个关键问题。本文将介绍8种方法&#xff0c;帮助您在海外媒体推广发稿平台上实现突破。 1. 确定目标受众 在开始使用海外媒体推…

篮球论坛|基于SprinBoot+vue的篮球论坛系统(源码+数据库+文档)

篮球论坛系统 目录 基于SprinBootvue的篮球论坛系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff…

AI大模型探索之路-实战篇5: Open Interpreter开放代码解释器调研实践

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;DB-GPT数据应用开发框架调研实践 目录 系列篇章&#x1f4a5;前言一、何为Open Interpreter&#xff1f;二、与 ChatGPT 的代码解释器比较三、 Open Interpreter的特性1、强大的本地计算能力2、丰富的功能3、高度的…

Spark在YARN上运行图解(资源调度+任务调度)及案例

前提&#xff1a;已经安装了spark集群&#xff0c;可参考上篇文章搭建&#xff1a;http://t.csdnimg.cn/UXBOp 一、Spark集群配置YARN 1、增加hadoop 配置文件地址 vim spark-env.sh 增加export HADOOP_CONF_DIR/usr/local/soft/hadoop-3.1.1/etc/hadoop 2、关闭虚拟内存 cd …

结构安全预警?事前发现?人工观测VS自动化监测,谁更胜一筹?

人工检测是依靠目测检查或借助于便携式仪器测量得到的信息&#xff0c;但是随着整个行业的发展&#xff0c;传统的人工检测方法已经不能满足检测需求&#xff0c;从人工检测到自动化监测已是必然趋势。 a. 从检测方式看 人工检测需要耗费大量的精力&#xff0c;从摆放检测工具到…

Golang | Leetcode Golang题解之第110题平衡二叉树

题目&#xff1a; 题解&#xff1a; func isBalanced(root *TreeNode) bool {return height(root) > 0 }func height(root *TreeNode) int {if root nil {return 0}leftHeight : height(root.Left)rightHeight : height(root.Right)if leftHeight -1 || rightHeight -1 …

最热门好用骨传导耳机推荐!!分享六大实用选购技巧助你挑选!

耳机基本是每人人手一台&#xff0c;不管是在地铁上还是在公交上&#xff0c;都可以看到很多人戴着耳机度过空余的时光&#xff0c;甚至现在人们在耳机的选择方面更加偏向于骨传导耳机&#xff0c;开放耳道的奇特设计在户外佩戴的时候可以更好的感知到周围的环境音&#xff0c;…

基于多模态MRI中深层语义和边缘信息融合的脑肿瘤分割 | 文献速递-深度学习肿瘤自动分割

Title 题目 Brain tumor segmentation based on the fusion of deep semantics and edge information in multimodal MRI 基于多模态MRI中深层语义和边缘信息融合的脑肿瘤分割 01 文献速递介绍 医学图像分割是医学图像处理领域的重要课题。其中&#xff0c;脑肿瘤分割旨在…

基础5 探索JAVA图形编程桌面:字符操作组件详解

在繁华都市的一个角落&#xff0c;卧龙和凤雏相聚在他们常去的台球厅。灯光洒在绿色的台球桌上&#xff0c;彩色的台球整齐地排列着&#xff0c;仿佛在等待着一场激烈的角逐。 卧龙轻轻地拿起球杆&#xff0c;微微瞄准&#xff0c;然后用力一击&#xff0c;白球带着一股强大的力…

C#_库的引用

类库的引用 还可以自己引用类库&#xff1a;解决方案-添加-新建项目 主程序 using System; using System.Windows.Forms; using Tools;namespace ConsoleApp2 {class Program{static void Main(string[] args){//Console.WriteLine("helloword");// Form form ne…

[力扣]——70.爬楼梯

题目描述&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 本题较为简单&#xff0c;主要用到递归思想 int fun(int n,int memo[]) {if(memo[n]!-1) //如果备忘录中已经有记录了…

MVCC相关

文章目录 前情要点基于什么引擎并发事务产生的问题不可重复读和幻读区别Next-Key Lock的示例解决并发事务采用的隔离级别当前读(Current Read)快照读(Snapshot Read)参考 MVCC定义表里面的隐藏字段由db_roll_ptr串成的版本链ReadView可见性算法mvcc的可见性算法为什么要以提交的…

Linux之单机项目部署

1、虚拟机&#xff08;VMware&#xff09;创建Linux系统 1.1、创建虚拟机 1.2、配置虚拟机IOS映射文件 1.3、虚拟机内部相关配置 等待加载即可&#xff0c;加载完后会弹出图形化界面&#xff0c;如图&#xff1a; 注意&#xff1a;一般我们做为管理员使用ROOT账号来操作&#x…

数据结构和算法基础(二)

树和二叉树——树的基本概念 树和二叉树——树转二叉树 树和二叉树——查找二叉树&#xff08;二叉排序树&#xff09; 树和二叉树——构造霍夫曼树&#xff08;最优&#xff09; 树和二叉树——线索二叉树 树和二叉树——平衡二叉树 图——基本概念 1、有向图 2、无向图 3、完…

BGP路由优化

一&#xff0c;拓扑 二&#xff0c;要求 用preva1策略确保R4通过R2到达192.168.10.0/24 &#xff0c;用AS Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 .用Local Preference策略&#xff0c;确保R1通过R2到达1…

FTP介绍

FTP 1、FTP—文件传输协议 文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;是用于在网络上进行文件传输的一套标准协议&#xff0c;它工作在 OSI 模型的第七层&#xff0c; TCP 模型的第四层&#xff0c; 即应用层&#xff0c; 使用 TCP 传输&…

PCB设计——返回路径

回流基本概念 从电路理论上看&#xff0c;信号是由电流传播的&#xff0c;明确的说是电子的运动&#xff0c;电子流的特性之一就是电子从不在任何地方停留&#xff0c;无论电流流到哪里&#xff0c;必然要回来&#xff0c;因此电流总是在环路中流动&#xff0c;从源到负载然后从…

[手游] 正义对决3

《正义对决3联机版》是一款多人联机的竞技射击游戏&#xff0c;玩家将扮演警方和强盗两个不同的势力&#xff0c;展开一场在庞大都市中的正义之战。强盗一方将在城市内抢劫各处并藏匿&#xff0c;而警方则必须将所有罪犯绳之以法。游戏中&#xff0c;玩家可自由购买众多武器装备…