最大流?费用流?结合二分图?例题

news2024/9/22 3:55:34

最大流

请添加图片描述

  • 就比如这张图,我们可以很容易看出该图的最大流为2,但如果我们取 0 − > 1 − > 2 − > 3 0->1->2->3 0>1>2>3这条路径,那么得出的阻塞流就为1,也就是说我们取的路径有可能阻塞了其他的路径导致取少

  • 那么该怎么解决呢,我们引入反向边的概念

  • 比如我们像刚刚那么取,但是引入反向边,那么图就变成请添加图片描述

  • 我们可以发现该图并没有变成阻塞流,还可以取 0 − > 2 − > 1 − > 3 0->2->1->3 0>2>1>3这条路径,让我们再取

请添加图片描述

  • 现在该图变成了阻塞流,而我们得到的最大流也就是2,因此引入反向边再让它完全变成阻塞流这种做法同理在其他图中也可以得到最大流

建图

struct edge{
	int v,w;
	edge* nex;
	int i;//在回溯时记录边
}ed[MAXM*2];
void add(int u,int v,int w){
	ed[ptop].w = w;
	ed[ptop].v = v;
	ed[ptop].nex = head[u];
	head[u] = &ed[ptop];
	ed[ptop].i = ptop;
	ptop++;
	ed[ptop].w = 0;
	ed[ptop].v = u;
	ed[ptop].nex = head[v];
	head[v] = &ed[ptop];//构造反向边
	ed[ptop].i = ptop;
	ptop++;
}

Edmonds-Karp算法

  • 需要两个部分:SAP找可行最短路径与根据最短路径更新图

  • SAP
int pre[MAXN*2],use[MAXN];
bool find(){
	memset(use,0,sizeof(use));//初始化
	use[s] = 1;//标记起点
	queue<int> qu;qu.push(s);//起点
	while(!qu.empty()){
		int x = qu.front();
		qu.pop();
		for(edge* p = head[x];p != NULL;p = p -> nex){
			int v = p -> v;
			if(use[v] || p -> val == 0)//没找过并且有边可行
				continue;
			pre[v] = p -> i;//记录这条边
			use[v] = 1;
			if(v == t)//如果是终点就停止
				return 1;
			qu.push(v);
		}
	}
	return 0;//没找到
}
  • 更新
void EK(){
	while(find()){//一直找直到没有
		ll mi = (ll)1 << 50;//记录路径最小的流量
		for(int i = pre[t];i != 0;i = pre[ed[i^1].v]){//非常酷,因为反向边的终点就是原来边的起点,而反向边id就是原来边id^1
			mi = min(mi,ed[i].val);
		}
		for(int i = pre[t];i != 0;i = pre[ed[i^1].v]){//更新图
			ed[i].val -= mi;
			ed[i^1].val += mi;
		}
		ans += mi;
	}
}
int d[MAXN];//记录深度
bool bfs(){//构造levelup图
	queue<int> qu;
	memset(d,-1,sizeof(d));
	d[s] = 0;
	qu.push(s);//放入起点
	while(!qu.empty()){
		int u = qu.front();
		qu.pop();
		edge* p = head[u];
		while(p != NULL){
			int v = p -> v;
			if(p -> w && d[v] == -1){//存在且还没加入图
				d[v] = d[u] + 1;
				qu.push(v);
			}
			p = p -> nex;
		}
	}
	if(d[t] == -1)//到不了终点
		return 0;
	else
		return 1;
}
  • dfs
ll dfs(int u,ll flow){//用递归来找阻塞流
	if(u == t)//到终点了就返回这个流
		return flow;
	edge* p = head[u];
	ll use = 0;
	while(p != NULL){
		int v = p -> v;
		if(d[v] == d[u] + 1 && p -> w){
			ll tem = dfs(v,min(flow,p -> w));//取最小的流继续
			flow -= tem;//减去用去的流继续
			ed[p -> i].w -= tem;
			ed[(p -> i) ^ 1].w += tem;
			use += tem;
			if(flow == 0)
				break;
		}
		p = p -> nex;
	}
	if(use == 0) d[u] = -1;
	return use;
}
  • Dinic
ll dinic(){
	ll ans = 0;
	while(bfs()){
		ans += dfs(s,inf);
	}
	return ans;
}

费用流:在最大流中找最小费用

#include<bits/stdc++.h>
using namespace std;

const int N = 5e4 + 10,M = 5e5 + 10,INF = 0x7f7f7f7f;
int n,m,s,t,ans1,ans2;

struct edge{
	int v,flow,cost,i;
	edge* nex;
}ed[M];
int ptop = 0;
edge* head[N];
void add(int u,int v,int flow,int cost){
	ed[ptop].v = v;
	ed[ptop].flow = flow;
	ed[ptop].cost = cost;
	ed[ptop].i = ptop;
	ed[ptop].nex = head[u];
	head[u] = &ed[ptop];
	ptop++;
	ed[ptop].v = u;
	ed[ptop].flow = 0;
	ed[ptop].cost = -cost;
	ed[ptop].i = ptop;
	ed[ptop].nex = head[v];
	head[v] = &ed[ptop];
	ptop++;
}

int pre[M],newcost[N],Flow[N];
bool vis[N];

inline bool spfa(){
	queue<int> qu;qu.push(s);vis[s] = 1;
	memset(Flow,0,sizeof(Flow));Flow[s] = INF;
	memset(newcost,INF,sizeof(newcost));newcost[s] = 0;
	memset(pre,0,sizeof(pre));
	while(!qu.empty()){
		int u = qu.front();
		qu.pop();
		vis[u] = 0;
		for(auto* p = head[u];p != NULL;p = p -> nex){
			int v = p -> v;
			if(p -> flow > 0 && newcost[v] > newcost[u] + p -> cost){
				newcost[v] = newcost[u] + p -> cost;
				Flow[v] = min(Flow[u],p -> flow);
				pre[v] = p -> i;
				if(!vis[v]){vis[v] = 1,qu.push(v);}
			}
		}
	}
	return newcost[t] != INF;
}

void EK(){
	while(spfa()){
		ans1 += Flow[t],ans2 += newcost[t]*Flow[t];
		int u = t;
		while(u != s){
			int k = pre[u];
			ed[k].flow -= Flow[t];
			ed[k^1].flow += Flow[t];
			u = ed[k^1].v;
		}
	}
}

int main(){
	cin >> n >> m >> s >> t;
	for(int i = 1;i <= m;i++){
		int u,v,flow,cost;
		cin >> u >> v >> flow >> cost;
		add(u,v,flow,cost);
	}
	EK();
	cout << ans1 << ' ' << ans2 << endl;
}

利用最大流解决二分图最大匹配

请添加图片描述

  • 我们添加一个0起点与9终点,然后让所有边权值为1跑最大流即可请添加图片描述
P2756 飞行员配对方案问题
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 20,MAXE = 5e4 + MAXN;
#define inf 0x3f3f3f3f
struct edge{
	int u,v,w;
	int i;
	edge* nex;
	bool f;//正常边
}ed[MAXE*2];
edge* head[MAXN];
int ptop = 0;
void add(int u,int v){
	ed[ptop].u = u;
	ed[ptop].v = v;
	ed[ptop].w = 1;
	ed[ptop].nex = head[u];
	head[u] = &ed[ptop];
	ed[ptop].i = ptop;
	ptop++;
	ed[ptop].v = u;
	ed[ptop].u = v;
	ed[ptop].w = 0;
	ed[ptop].nex = head[v];
	head[v] = &ed[ptop];
	ed[ptop].i = ptop;
	ptop++;
}
int d[MAXN];
int s = 0,t;
bool bfs(){
	queue<int> qu;
	qu.push(s);
	memset(d,-1,sizeof(d));
	d[s] = 0;
	while(!qu.empty()){
		int u = qu.front();
		qu.pop();
		edge* p = head[u];
		while(p != NULL){
			int v = p -> v;
			if(p -> w && d[v] == -1){
				d[v] = d[u] + 1;
				qu.push(v);
			}
			p = p -> nex;
		}
	}
	if(d[t] == -1)
		return 0;
	else
		return 1;
}
int dfs(int u,int flow){
	edge* p = head[u];
	if(u == t)
		return flow;
	int use = 0;
	while(p != NULL){
		int v = p -> v;
		if(d[v] == d[u] + 1 && p -> w){
			int tem = dfs(v,min(flow,p -> w));
			use += tem;
			flow -= tem;
			ed[p -> i].w -= tem;
			ed[(p -> i)^1].w += tem;
			if(flow == 0)
				break;
		}
		p = p -> nex;
	}
	if(use == 0)
		d[u] = -1;
	return use;
}
int dinic(){
	int ans = 0;
	while(bfs()){
		ans += dfs(s,inf);
	}
	return ans;
}
int main()
{
	int n,m;cin >> m >> n;
	n -= m;
	for(int i = 1;i <= m;i++)//原点
		add(s,i);
	t = n + m + 1;
	for(int i = 1 + m;i < t;i++)//终点
		add(i,t);
	int u,v;
	while(cin >> u >> v)
	{
		if(u == -1)
			break;
		add(u,v);
		ed[ptop - 2].f = 1;
	}
	cout << dinic() << endl;
	for(int i = 1;i <= ptop;i++){
		if(ed[i].w == 0 && ed[i].f)
			cout << ed[i].u << ' ' << ed[i].v << endl;
	}
}

最大流中让最大边流量最小

二分限制边大小跑dinic,如果与无限制相同说明可行,继续限制
P3305 [SDOI2013] 费用流(假费用流题)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int MAXN = 201,MAXM = 5e3 + 10;
const double eps = 1e-8;
struct edge{
	int v;
	double w,_w;
	edge* nex;
	int i;
}ed[MAXM*2];
edge* head[MAXN];
int ptop = 0;
void add(int u,int v,double w){
	ed[ptop].w = w;
	ed[ptop]._w = w;
	ed[ptop].v = v;
	ed[ptop].nex = head[u];
	head[u] = &ed[ptop];
	ed[ptop].i = ptop;
	ptop++;
	ed[ptop].w = 0;
	ed[ptop]._w = 0;
	ed[ptop].v = u;
	ed[ptop].nex = head[v];
	head[v] = &ed[ptop];//构造反向边
	ed[ptop].i = ptop;
	ptop++;
}
int n,m,s,t;
int d[MAXN];//记录深度
bool bfs(){//构造levelup图
	queue<int> qu;
	memset(d,-1,sizeof(d));
	d[s] = 0;
	qu.push(s);//放入起点
	while(!qu.empty()){
		int u = qu.front();
		qu.pop();
		edge* p = head[u];
		while(p != NULL){
			int v = p -> v;
			if((p -> w > eps) && d[v] == -1){//存在且还没加入图
				d[v] = d[u] + 1;
				qu.push(v);
			}
			p = p -> nex;
		}
	}
	if(d[t] == -1)//到不了终点
		return 0;
	else
		return 1;
}
double dfs(int u,double flow){
	if(u == t)
		return flow;
	edge* p = head[u];
	double use = 0;
	while(p != NULL){
		int v = p -> v;
		if(d[v] == d[u] + 1 && p -> w){
			double tem = dfs(v,min(flow,p -> w));
			flow -= tem;
			ed[p -> i].w -= tem;
			ed[(p -> i) ^ 1].w += tem;
			use += tem;
			if(flow == 0)
				break;
		}
		p = p -> nex;
	}
	if(fabs(use) < eps) d[u] = -1;
	return use;
}
double dinic(){
	double ans = 0;
	bool f = bfs();
	while(f){
		ans += dfs(s,inf);
		f = bfs();
	}
	return ans;
}
double lim;
void init(){
	for(int i = 0;i <= ptop;i++)
		ed[i].w = min(ed[i]._w,lim);
}
double p;
int main()
{
	cin >> n >> m >> p;
	s = 1,t = n;
	for(int i = 1;i <= m;i++){
		int u,v,w;cin >> u >> v >> w;
		add(u,v,w);
	}
	double st = dinic();
	double l = 0,r = 5e4;
	double ans = 0;
	while((r - l) > eps){
		lim = (l + r) / 2;
		init();
		double no = dinic();
		if(fabs(no - st) < eps){
			ans = lim * p;
			r = lim;
		}else{
			l = lim;
		}
	}
	printf("%d\n%.4lf",(int)st,ans);
}

二分限制的二部图最大流(瞎起名是吧 )

P3324 [SDOI2015] 星际战争
题意:N个机器人与M个激光武器,给出每个激光武器每秒的伤害,机器人的血量,每个激光武器能攻击到的机器人,问打爆所有机器人需要的最小时间
思路:对于特定的时间,激光武器能给出的输出总量不同,将它看作起点到激光武器的流量,在特定时间对应的流量能够使得到终点的流量保持最大值那么说明该时间能够将所有机器人打爆,否则不能,然后二分即可
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 201,MAXM = 5e3 + 10;
const double eps = 1e-8,inf = 1e9 + 10;
struct edge{
	int v;
	double w,_w;
	edge* nex;
	int i;
}ed[MAXM*2];
edge* head[MAXN];
int ptop = 0;
void add(int u,int v,double w){
	ed[ptop].w = w;
	ed[ptop]._w = w;
	ed[ptop].v = v;
	ed[ptop].nex = head[u];
	head[u] = &ed[ptop];
	ed[ptop].i = ptop;
	ptop++;
	ed[ptop].w = 0;
	ed[ptop]._w = 0;
	ed[ptop].v = u;
	ed[ptop].nex = head[v];
	head[v] = &ed[ptop];//构造反向边
	ed[ptop].i = ptop;
	ptop++;
}
int n,m,s,t;
int d[MAXN];//记录深度
bool bfs(){//构造levelup图
	queue<int> qu;
	memset(d,-1,sizeof(d));
	d[s] = 0;
	qu.push(s);//放入起点
	while(!qu.empty()){
		int u = qu.front();
		qu.pop();
		edge* p = head[u];
		while(p != NULL){
			int v = p -> v;
			if((p -> w > eps) && d[v] == -1){//存在且还没加入图
				d[v] = d[u] + 1;
				qu.push(v);
			}
			p = p -> nex;
		}
	}
	if(d[t] == -1)//到不了终点
		return 0;
	else
		return 1;
}
double dfs(int u,double flow){
	if(u == t)
		return flow;
	edge* p = head[u];
	double use = 0;
	while(p != NULL){
		int v = p -> v;
		if(d[v] == d[u] + 1 && p -> w){
			double tem = dfs(v,min(flow,p -> w));
			flow -= tem;
			ed[p -> i].w -= tem;
			ed[(p -> i) ^ 1].w += tem;
			use += tem;
			if(flow == 0)
				break;
		}
		p = p -> nex;
	}
	if(fabs(use) < eps) d[u] = -1;
	return use;
}
double dinic(){
	double ans = 0;
	bool f = bfs();
	while(f){
		ans += dfs(s,inf);
		f = bfs();
	}
	return ans;
}
double tim,a[MAXN],b[MAXN];
void init(){
	for(int i = 0;i <= 2*n - 2;i += 2){
		ed[i].w = tim * a[(i + 2) / 2];
		ed[i^1].w = 0;
	}
	for(int i = 2*n;i <= ptop;i++){
		ed[i].w = ed[i]._w;
	}
}
int main()
{
	cin >> n >> m;
	swap(n,m);
	for(int i = 1;i <= m;i++)
		cin >> b[i];
	for(int i = 1;i <= n;i++)
		cin >> a[i];
	s = 0,t = n + m + 1;
	for(int i = 1;i <= n;i++){
		//cin >> a[i];
		add(s,i,inf);
	}
	for(int i = 1;i <= m;i++){
		//cin >> b[i];
		add(i + n,t,b[i]);
	}
	for(int i = 1;i <= n;i++)
	for(int j = 1;j <= m;j++){
		int op;cin >> op;
		if(op)
			add(i,j + n,inf);
	}
	double all = dinic();
	double l = 0,r = 5e4;
	while(fabs(r - l) > eps){
		tim = (l + r) / 2;
		init();
		if(fabs(dinic() - all) < eps){
			r = tim;
		}else
			l = tim;
	}
	printf("%.4lf",l);
}

最大流板子题

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int MAXN = 201,MAXM = 5e3 + 10;
struct edge{
	int v;
	ll w;
	edge* nex;
	int i;
}ed[MAXM*2];
edge* head[MAXN];
int ptop = 0;
void add(int u,int v,ll w){
	ed[ptop].w = w;
	ed[ptop].v = v;
	ed[ptop].nex = head[u];
	head[u] = &ed[ptop];
	ed[ptop].i = ptop;
	ptop++;
	ed[ptop].w = 0;
	ed[ptop].v = u;
	ed[ptop].nex = head[v];
	head[v] = &ed[ptop];//构造反向边
	ed[ptop].i = ptop;
	ptop++;
}
int n,m,s,t;
int d[MAXN];//记录深度
bool bfs(){//构造levelup图
	queue<int> qu;
	memset(d,-1,sizeof(d));
	d[s] = 0;
	qu.push(s);//放入起点
	while(!qu.empty()){
		int u = qu.front();
		qu.pop();
		edge* p = head[u];
		while(p != NULL){
			int v = p -> v;
			if(p -> w && d[v] == -1){//存在且还没加入图
				d[v] = d[u] + 1;
				qu.push(v);
			}
			p = p -> nex;
		}
	}
	if(d[t] == -1)//到不了终点
		return 0;
	else
		return 1;
}
ll dfs(int u,ll flow){
	if(u == t)
		return flow;
	edge* p = head[u];
	ll use = 0;
	while(p != NULL){
		int v = p -> v;
		if(d[v] == d[u] + 1 && p -> w){
			ll tem = dfs(v,min(flow,p -> w));
			flow -= tem;
			ed[p -> i].w -= tem;
			ed[(p -> i) ^ 1].w += tem;
			use += tem;
			if(flow == 0)
				break;
		}
		p = p -> nex;
	}
	if(use == 0) d[u] = -1;
	return use;
}
ll dinic(){
	ll ans = 0;
	while(bfs()){
		ans += dfs(s,inf);
	}
	return ans;
}
int main()
{
	cin >> n >> m >> s >> t;
	for(int i = 1;i <= m;i++){
		int u,v,w;cin >> u >> v >> w;
		add(u,v,w);
	}
	cout << dinic();
}

费用流板子题

【模板】最小费用最大流
#include<bits/stdc++.h>
using namespace std;

const int N = 5e4 + 10,M = 5e5 + 10,INF = 0x7f7f7f7f;
int n,m,s,t,ans1,ans2;

struct edge{
	int v,flow,cost,i;
	edge* nex;
}ed[M];
int ptop = 0;
edge* head[N];
void add(int u,int v,int flow,int cost){
	ed[ptop].v = v;
	ed[ptop].flow = flow;
	ed[ptop].cost = cost;
	ed[ptop].i = ptop;
	ed[ptop].nex = head[u];
	head[u] = &ed[ptop];
	ptop++;
	ed[ptop].v = u;
	ed[ptop].flow = 0;
	ed[ptop].cost = -cost;
	ed[ptop].i = ptop;
	ed[ptop].nex = head[v];
	head[v] = &ed[ptop];
	ptop++;
}

int pre[M],newcost[N],Flow[N];
bool vis[N];

inline bool spfa(){
	queue<int> qu;qu.push(s);vis[s] = 1;
	memset(Flow,0,sizeof(Flow));Flow[s] = INF;
	memset(newcost,INF,sizeof(newcost));newcost[s] = 0;
	memset(pre,0,sizeof(pre));
	while(!qu.empty()){
		int u = qu.front();
		qu.pop();
		vis[u] = 0;
		for(auto* p = head[u];p != NULL;p = p -> nex){
			int v = p -> v;
			if(p -> flow > 0 && newcost[v] > newcost[u] + p -> cost){
				newcost[v] = newcost[u] + p -> cost;
				Flow[v] = min(Flow[u],p -> flow);
				pre[v] = p -> i;
				if(!vis[v]){vis[v] = 1,qu.push(v);}
			}
		}
	}
	return newcost[t] != INF;
}

void EK(){
	while(spfa()){
		ans1 += Flow[t],ans2 += newcost[t]*Flow[t];
		int u = t;
		while(u != s){
			int k = pre[u];
			ed[k].flow -= Flow[t];
			ed[k^1].flow += Flow[t];
			u = ed[k^1].v;
		}
	}
}

int main(){
	cin >> n >> m >> s >> t;
	for(int i = 1;i <= m;i++){
		int u,v,flow,cost;
		cin >> u >> v >> flow >> cost;
		add(u,v,flow,cost);
	}
	EK();
	cout << ans1 << ' ' << ans2 << endl;
}

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

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

相关文章

飞行动力学 - 第5节-part3-爬升性能随高度的变化趋势 之 基础点摘要

飞行动力学 - 第5节-part3-爬升性能随高度的变化趋势 之 基础点摘要 1. 动力学方程2. 爬升角、爬升率趋势3. 参考资料 1. 动力学方程 回顾下&#xff0c;根据牛顿第一运动定律给出的动力学方程&#xff1a; 2. 爬升角、爬升率趋势 从推导公式的角度&#xff0c;上述趋势需要考…

按下数实融合的加速键,新华三推动基础设施变革

去年底&#xff0c;生成式AI&#xff08;AIGC&#xff09;开始席卷全球&#xff0c;吸引社会各界的广泛关注。 正所谓AI黄金时代的到来&#xff0c;将重新定义各行各业。AIGC热浪来袭&#xff0c;标志着在数实融合的大趋势下&#xff0c;人工智能大范围应用的奇点已经来临&…

Excel转图片(Java方式)

先看效果、先看效果、先看效果 左侧&#xff1a;Excel的截图 右侧&#xff1a;生成的图片 开发工具&#xff1a; Eclipse 开发环境&#xff1a; JDK1.8 使用技术&#xff1a; Graphics2D&#xff1a;&#xff08;JDK自带&…

使用python调用ChatGPT API 简单示例

如果你已经获得了OpenAI的API密钥&#xff0c;并且想要使用Python发起ChatGPT对话&#xff0c;你可以使用OpenAI的Python SDK来实现。下面是一个简单的示例代码&#xff1a; 首先&#xff0c;你需要确保已安装OpenAI的Python SDK。你可以使用pip来安装&#xff1a; pip insta…

模板(上)

文章目录 泛型编程函数模板类模板 一、泛型编程 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础。 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& …

什么是混合云?

混合云&#xff08;Hybrid Cloud&#xff09;是指结合了私有云和公有云的计算环境。私有云是指在企业内部建立的基础设施&#xff0c;由企业自己管理和控制&#xff1b;而公有云是由第三方云服务提供商&#xff08;如亚马逊AWS、微软Azure、谷歌云等&#xff09;提供的计算资源…

浅谈无效化一个空窗口的后果

有时候&#xff0c;你可能会注意到这样一个现象&#xff1a;桌面上的所有窗口都刷新了自身并产生了闪烁。 导致这个现象的原因之一是一个所谓的空句柄窗口 Bug。 如果你研究过 Win32 SDK 编程&#xff0c;则你应该比较熟悉这个函数&#xff1a;InvalidateRect。 调用这个函数可…

C# PaddleInference 图片旋转角度检测

效果 项目 VS2022.net4.8 OpenCvSharp4Sdcb.PaddleInference 代码 using OpenCvSharp; using Sdcb.PaddleInference; using Sdcb.PaddleInference.Native; using System; using System.Drawing; using System.Globalization; using System.Linq; using System.Runtime.Interop…

14天学会:基于J2EE的JAVA WEB基础

系列文章 手把手教你&#xff1a;基于Django的新闻文本分类可视化系统&#xff08;文本分类由bert实现&#xff09; 手把手教你&#xff1a;基于python的文本分类&#xff08;sklearn-决策树和随机森林实现&#xff09; 手把手教你&#xff1a;岩石样本智能识别系统 一、学习…

港联证券|股票长线投资技巧?

股票长线出资主要是看股票长时间的开展&#xff0c;所以主张从以下几个方面来剖析&#xff1a; 1、经济环境 把握宏观经济大势。股市是宏观经济的风向标&#xff0c;它在宏观经济的大环境中开展&#xff0c;而且经济的变动趋势也会影响长时间出资的收益。假如出资者能够把握住…

【java】修改JsonObject中的属性值

Java修改JsonObject中的属性值 <!-- 阿里JSON解析器 --><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.16</version></dependency>例子 public static void m…

设计师都在找的在线SVG编辑工具!赶快收藏

为了方便设计师编辑和修改SVG图形&#xff0c;本文将介绍5款易于使用的在线SVG编辑工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一款强大的在线SVG编辑工具&#xff0c;它可以支持路径编辑、形状编辑、填充和边框编辑、文本编辑等多种编辑需求&#xff…

人工智能套装 Ai Kit 横向测评

本文涉及到的产品 1 mechArm 270 2 mycobot 280 3 mypalletizer 260 4 AI kit 主题内容 今天的文章的主题主要介绍一下跟aikit 套件搭配的三款机械臂&#xff0c;它们之间分别有什么不一样的地方。 前言 假如说你有一台机械臂的话&#xff0c;你会用它来干什么呢&#…

【Django学习】(十一)APIView_请求与响应_GenericAPIView

继承DRF中APIView之后&#xff0c;那么当前视图就具备了认证、授权、限流等功能 继承DRF中APIView之后&#xff0c;每一个实例方法中的request为Request对象 Request类拓展了Django中的HttpRequest类&#xff0c;具备很多额外优秀的功能Request类与HttpRequest类中的所有功能兼…

2022年06月份青少年软件编程Scratch图形化等级考试试卷二级真题(含答案)

2022-06 Scratch真题二级 分数&#xff1a;100 题数&#xff1a;37 一、单选题(共25题&#xff0c;共50分) 1.角色初始位置如图所示&#xff0c;下面哪个选项能让角色移到舞台的左下角&#xff1f;&#xff08; &#xff09;(2分) A. B. C. D. 2.点击绿旗&#xff0c;执…

【面试题27】Redis中的connect和pconnect如何使用,有什么区别

文章目录 一、背景二、connect函数三、pconnect函数四、区别和使用场景五、总结 一、背景 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标资深工程师/架构师序列&#xff0c;欢迎大家提前关注锁定。 Redis是一个开…

六、HAL_Timer的PWM功能

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407XGT6 2、PWM简介 2.1、什么是PWM (1)PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用&#xff0c;方波的占空比被调制用来对一个具体模拟信号的电平进行编码。 (2)P…

Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling

感想&#xff1a;由于看不懂官方代码的原因&#xff0c;自己这方面耽误了一段时间&#xff0c;一方面&#xff0c;在AI与经济学之间犹豫了许久&#xff0c;另一方面&#xff0c;工作 了半年&#xff0c;也没发工资&#xff0c;没空找培训代码的课程&#xff0c;所以停止更新了三…

Nginx-代理服务器详解

本文已收录于专栏 《中间件合集》 目录 概念说明Nginx代理 提供服务总结提升 概念说明 Nginx Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。它具有很多非常优越的特性&#xff1a;在连接高并发的情况下&#xff0c;Nginx是Aoache服…

机器学习算法之决策树(decision tree)

1 决策树算法介绍 决策树(Decision Tree,又称为判定树)算法是机器学习中常见的一类算法&#xff0c;是一种以树结构形式表达的预测分析模型。决策树属于监督学习&#xff08;Supervised learning&#xff09;&#xff0c;根据处理数据类型的不同&#xff0c;决策树又为分类决策…