最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版)

news2024/11/27 4:32:12

在这里插入图片描述
在这里插入图片描述

文章目录

  • 前言
  • A - Dijkstra Algorithm
    • 0x00 算法题目
    • 0x01 算法思路
    • 0x02 代码实现
  • B - 最长路
    • 0x00 算法题目
    • 0x01 算法思路
    • 0x02 代码实现
  • C - 二分图最大匹配
    • 0x00 算法题目
    • 0x01 算法思路
    • 0x02 代码实现
  • D - 搭配飞行员
    • 0x00 算法题目
    • 0x01 算法思路
    • 0x02 代码实现
  • E - The Perfect Stall
    • 0x00 算法题目
    • 0x01 算法思路
    • 0x02 代码实现
  • F - Asteroids
    • 0x00 算法题目
    • 0x01 算法思路
    • 0x02 代码实现
  • G - Til the Cows Come Home
    • 0x00 算法题目
    • 0x01 算法思路
    • 0x02 代码实现
  • H - 拓扑排序
    • 0x00 算法题目
    • 0x01 算法思路
    • 0x02 代码实现
  • 总结


前言

最短路Dijkstra,spfa,图论二分图算法AYIT—ACM训练(模板版)
A — Dijkstra
B — spfa/Dijkstra
C — 二分图
D — 二分图
E — 二分图
F — 二分图
G — Dijkstra
H — Topsort


A - Dijkstra Algorithm

0x00 算法题目

在这里插入图片描述

0x01 算法思路

Dijkstra算法基础模板题

💬 模板演示:

int dijkstra()
{
    memset(dist,0x3f,sizeof dist);

    dist[1]=0;

    for(int i=0;i<n;i++)
    {
        int t=-1;
        for(int j=1;j<=n;j++)
        {
            if(!st[j] && (t==-1 || dist[t] > dist[j]))
                t=j;
        }

        st[t]=true;

        for(int j=1;j<=n;j++)
            dist[j]=min(dist[j],dist[t]+g[t][j]);
    }
    if(dist[n]==0x3f3f3f3f) return -1;
    return dist[n];

}

0x02 代码实现

朴素版本Dijkstra:

💬 代码演示:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 510;
int g[N][N];
bool st[N];
int dist[N];
int n,s,f;

int dijkstra()
{
	memset(dist,0x3f,sizeof dist);
	dist[s]=0;
	
	for(int i=0;i<n;i++)
	{
		int t=-1;
		for(int j=1;j<=n;j++)
			if(!st[j] && (t==-1 || dist[t] > dist[j]))
				t=j;
		
		st[t]=true;
		for(int j=1;j<=n;j++)
			dist[j]=min(dist[j],dist[t]+g[t][j]);
	}
	if(dist[f]==0x3f3f3f3f) return -1;
	return dist[f];
}

int main()
{
	cin>>n>>s>>f;
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			int x;
			cin>>x;
			if(x==-1) g[i][j]=0x3f3f3f3f;
			else g[i][j]=x;
		}
	}
	
	int t =dijkstra();
	cout<<t<<endl;
	
	return 0;
}

🚩 运行结果:
在这里插入图片描述
spfa算法:
💬 代码演示:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;
const int N=110,M=110*110;
int n,s,f;
bool st[N];
int h[N],w[M],ne[M],e[M],idx;
int dist[N];

void add(int a,int b,int c)
{
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}

int spfa()
{
	memset(dist,0x3f,sizeof dist);
	dist[s]=0;
	queue<int> q;
	q.push(s);
	while(q.size())
	{
		int t = q.front();
		q.pop();
		st[t]=false;
		
		for(int i=h[t];i!=-1;i=ne[i])
		{
			int j=e[i];
			if(dist[j] > dist[t] + w[i])
			{
				dist[j]=dist[t]+w[i];
				if(!st[j])
				{
					q.push(j);
					st[j]=true;
				}
			}
		}
	}
	if(dist[f]==0x3f3f3f3f) return -1;
	else return dist[f];
}

int main()
{
	cin>>n>>s>>f;
	memset(h,-1,sizeof h);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			int x;
			cin>>x;
			//if(x==-1) continue;
			if(x>0) add(i,j,x);
		}
	}
	cout<<spfa()<<endl;
	
	return 0;
}

🚩 运行结果:
在这里插入图片描述

B - 最长路

0x00 算法题目

在这里插入图片描述

0x01 算法思路

spfa算法基础模板题

💬 模板演示:

int spfa()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;

    queue<int> q;
    q.push(1);

    while(q.size())
    {
        auto t = q.front();
        q.pop();
        st[t]=false;
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j = e[i];
            if(dist[j] > dist[t]+w[i])
            {
                dist[j]=dist[t]+w[i];
                if(!st[j])
                {
                    q.push(j);
                    st[j]=true;
                }
            }
        }
    }
    return dist[n];
}

0x02 代码实现

spfa算法:
💬 代码演示:

#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
const int N = 1510,INF = 0x3f3f3f3f;
int n,m;
int dist[N];
int g[N][N];
queue<int> q;

void spfa()
{
	memset(dist,-1,sizeof dist);
	dist[1]=0;
	q.push(1);
	while(!q.empty())
	{
		int t = q.front();
		q.pop();
		for(int j=1;j<=n;j++)
		{
			if(g[t][j] && dist[j] < dist[t] + g[t][j])
			{
				dist[j] = dist[t] + g[t][j];
				q.push(j);
			}
		}
	}
	
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		g[a][b]=max(g[a][b],c);
	}
	spfa();
	cout<<dist[n]<<endl;
	return 0;
}

🚩 运行结果:
在这里插入图片描述

C - 二分图最大匹配

0x00 算法题目

在这里插入图片描述

0x01 算法思路

二分图模板题

💬 模板演示:

//邻接表
bool find(int x)
{
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true;
            if (match[j] == 0 || find(match[j]))
            {
                match[j] = x;
                return true;
            }
        }
    }

    return false;
}
//邻接矩阵
bool find(int x)
{
    for(int i=0;i<g[x].size();++i)
    {
        int j = g[x][i];
        if(!st[j])
        {
            st[j]=true;
            if(match[j]==0 || find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}

0x02 代码实现

💬 代码演示:

#include<iostream>
#include<cstring>

using namespace std;

const int N = 510,M=5e4+10;
int n,m,q;
int h[N],e[M],ne[M],idx;
int match[N];
bool st[N];

void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

bool find(int x)
{
	for(int i=h[x];i!=-1;i=ne[i])
	{
		int j = e[i];
		if(!st[j])
		{
			st[j]=true;
			if(match[j]==0 || find(match[j]))
			{
				match[j]=x;
				return true;
			}
		}
	}
	return false;
}

int main()
{
	cin>>n>>m>>q;
	memset(h,-1,sizeof h);
	while(q--)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	int res=0;
	for(int i=1;i<=n;i++)
	{
		memset(st,false,sizeof st);
		if(find(i)) res++;
	}
	cout<<res<<endl;
	
	return 0;
}

🚩 运行结果:
在这里插入图片描述

D - 搭配飞行员

0x00 算法题目

在这里插入图片描述

0x01 算法思路

二分图模板题

💬 模板演示:

//邻接表
bool find(int x)
{
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true;
            if (match[j] == 0 || find(match[j]))
            {
                match[j] = x;
                return true;
            }
        }
    }

    return false;
}
//邻接矩阵
bool find(int x)
{
    for(int i=0;i<g[x].size();++i)
    {
        int j = g[x][i];
        if(!st[j])
        {
            st[j]=true;
            if(match[j]==0 || find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}

0x02 代码实现

💬 代码演示:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>

using namespace std;
const int N = 110;

int n,m;
int map[N][N];
int match[N];
bool st[N];
vector<int> g[N];
bool find(int x)
{
	for(int i=0;i<g[x].size();++i)
	{
		int j = g[x][i];
		if(!st[j])
		{
			st[j]=true;
			if(match[j]==0 || find(match[j]))
			{
				match[j]=x;
				return true;
			}
		}
	}
	return false;
}

int main()
{
	scanf("%d %d",&n,&m);
	int a,b;
	while(cin>>a>>b)
	{
		g[a].push_back(b);
	}
	
	int res = 0;
	for(int i=1;i<=m;i++)
	{
		memset(st,false,sizeof st);
		if(find(i)) 
		{
			res++;
		}
	}
	
	cout<<res;
	
	return 0;
}

🚩 运行结果:
在这里插入图片描述

E - The Perfect Stall

0x00 算法题目

在这里插入图片描述

0x01 算法思路

二分图模板题

💬 模板演示:

//邻接表
bool find(int x)
{
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true;
            if (match[j] == 0 || find(match[j]))
            {
                match[j] = x;
                return true;
            }
        }
    }

    return false;
}
//邻接矩阵
bool find(int x)
{
    for(int i=0;i<g[x].size();++i)
    {
        int j = g[x][i];
        if(!st[j])
        {
            st[j]=true;
            if(match[j]==0 || find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}

0x02 代码实现

💬 代码演示:

#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int N = 510,M=5e4+10;
int n,m;
int match[N];
bool st[N];
vector<int> g[N];

bool find(int x)
{
	for(int i=0;i<g[x].size();++i)
	{
		int j = g[x][i];
		if(!st[j])
		{
			st[j]=true;
			if(match[j]==0 || find(match[j]))
			{
				match[j]=x;
				return true;
			}
		}
	}
	return false;
}

int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		memset(st,false,sizeof st);
		memset(match,0,sizeof match);
		for(int i=1;i<=n;i++)
		{
			
			g[i].clear();
			int s;
			cin>>s;
			while(s--)
			{
				int q;
				cin>>q;
				g[i].push_back(q);
			}
		}
		int res=0;
		for(int i=1;i<=n;i++)
		{
			memset(st,false,sizeof st);
			if(find(i)) res++;
		}
		cout<<res<<endl;
	}
	
	return 0;
}

🚩 运行结果:
在这里插入图片描述

F - Asteroids

0x00 算法题目

在这里插入图片描述

0x01 算法思路

二分图模板题

💬 模板演示:

//邻接表
bool find(int x)
{
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true;
            if (match[j] == 0 || find(match[j]))
            {
                match[j] = x;
                return true;
            }
        }
    }

    return false;
}
//邻接矩阵
bool find(int x)
{
    for(int i=0;i<g[x].size();++i)
    {
        int j = g[x][i];
        if(!st[j])
        {
            st[j]=true;
            if(match[j]==0 || find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}

0x02 代码实现

💬 代码演示:

#include<iostream>
#include<cstring>
using namespace std;
const int N = 510,M=5e4+10;
int n,m,q;
int h[N],e[M],ne[M],idx;
int match[N];
bool st[N];

void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

bool find(int x)
{
	for(int i=h[x];i!=-1;i=ne[i])
	{
		int j = e[i];
		if(!st[j])
		{
			st[j]=true;
			if(match[j]==0 || find(match[j]))
			{
				match[j]=x;
				return true;
			}
		}
	}
	return false;
}

int main()
{
	cin>>n>>m;
	memset(h,-1,sizeof h);
	while(m--)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	int res=0;
	for(int i=1;i<=n;i++)
	{
		memset(st,false,sizeof st);
		if(find(i)) res++;
	}
	cout<<res<<endl;
	
	return 0;
}

🚩 运行结果:
在这里插入图片描述

G - Til the Cows Come Home

0x00 算法题目

在这里插入图片描述

0x01 算法思路

Dijkstra算法基础模板题

💬 模板演示:

int dijkstra()
{
    memset(dist,0x3f,sizeof dist);

    dist[1]=0;

    for(int i=0;i<n;i++)
    {
        int t=-1;
        for(int j=1;j<=n;j++)
        {
            if(!st[j] && (t==-1 || dist[t] > dist[j]))
                t=j;
        }

        st[t]=true;

        for(int j=1;j<=n;j++)
            dist[j]=min(dist[j],dist[t]+g[t][j]);
    }
    if(dist[n]==0x3f3f3f3f) return -1;
    return dist[n];

}

0x02 代码实现

💬 代码演示:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<stdbool.h>

using namespace std;

const int N=1010,inf = 0x3f3f3f3f;

int n,m;
bool st[N];
int dist[N];
int g[N][N];

int dijkstra()
{
	memset(dist,inf,sizeof(dist));
	dist[1]= 0;
	for(int i=1;i <= n;i++)
	{
		int t=-1;
		for(int j=1;j<=n;j++)
			if(!st[j] && (t==-1 || dist[t] > dist[j]))
				t=j;
		
		st[t]=true;
		for(int j=1;j<=n;j++)
			dist[j]=min(dist[j],dist[t]+g[t][j]);
	}
	return dist[n];
}


int main()
{
	cin>>m>>n;
	memset(g,inf,sizeof g);
	
	for(int i=0;i<m;++i)
	{
		int a,b,c;
		cin>>a>>b>>c; 
		g[a][b]=g[b][a]=min(g[a][b],c);
	}
	cout<< dijkstra() <<endl;
	return 0;
}

🚩 运行结果:
在这里插入图片描述

H - 拓扑排序

0x00 算法题目

在这里插入图片描述

0x01 算法思路

拓扑排序算法基础模板题

💬 模板演示:

bool topsort()
{
    int hh=0,tt=-1;

    for (int i = 1; i <= n; i ++ )
        if (!d[i])
            q[ ++ tt] = i;

    while(hh<=tt)
    {
        int t = q[hh ++ ];

        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (-- d[j] == 0)
                q[ ++ tt] = j;
        }
    }
    return tt==n-1;
}

0x02 代码实现

💬 代码演示:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>

using namespace std;

const int N=100010;

int n,m;
vector<int> v[N];
int size,d[N];
int ans[N];

void topsort()
{
	priority_queue<int,vector<int>,greater<int> > q;
	for(int i=1;i<=n;i++)
		if(!d[i]) q.push(i);
	
	while(!q.empty())
	{
		int t = q.top();
		q.pop();
		ans[size++] = t;
		for(auto it : v[t])
		{
			d[it]--;
			if(!d[it]) q.push(it);
		}
	}
}

int main()
{
	cin>>n>>m;
	
	for(int i=0;i<m;i++)
	{
		int a,b;
		cin>>a>>b;
		v[a].push_back(b);
		d[b]++;
	}
	topsort();
	
	for(int i=0 ; i<size ;i++)
		cout<< 'v' << ans[i] <<' ';
	
	return 0;
}

🚩 运行结果:
在这里插入图片描述


总结

这次训练很明显涉及到了最短路Dijkstra,spfa,图论二分图算法,以及topsort算法,这次考的比较基础,但是让我意识到了,算法必须熟练记忆模板是很重要的。

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

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

相关文章

企业架构LNMP学习笔记11

Nginx配置文件的介绍&#xff1a; #nginx子进程启动用户 #user nobody; #子进程数量 一般调整为cpu核数或者倍数 worker_processes 1; #错误日志定义 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#进程pid 存储文件…

ISO/IEC/ITU标准如何快速查找(三十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

C++中的语法知识虚继承和虚基类

多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。 多继承时很容易产生命名冲突,即使我们很小心地将所有类…

UDP和TCP协议报文格式详解

在初识网络原理(初识网络原理_蜡笔小心眼子&#xff01;的博客-CSDN博客)这篇博客中,我们简单的了解了一下TCP/IP五层网络模型,这篇博客将详细的学习一下五层网络模型中传输层的两个著名协议:UDP和TCP 目录 一, 传输层的作用 二, UDP 1,UDP协议的特点 2,UDP报文格式 三, TC…

【数据结构】如何设计循环队列?图文解析(LeetCode)

LeetCode链接&#xff1a;622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 目录 做题思路 只开辟 k 个空间 多开一个空间 代码实现 1. 循环队列的结构 2. 开辟空间 3. 判断空 4. 判断满 5. 队尾插入数据 6. 队头删除数据 7. 获取队头元素 8. 获取队尾元…

ElasticSearch第二讲:ES详解 - ElasticSearch基础概念

ElasticSearch第二讲&#xff1a;ES详解 - ElasticSearch基础概念 在学习ElasticSearch之前&#xff0c;先简单了解下ES流行度&#xff0c;使用背景&#xff0c;以及相关概念等。本文是ElasticSearch第二讲&#xff0c;ElasticSearch的基础概念。 文章目录 ElasticSearch第二讲…

【GoldenDict】win11牛津高阶英汉双解词典安装使用方法

【词典资源】 1&#xff08;本文章使用的版本&#xff09;牛津高阶&#xff08;第10版 英汉双解&#xff09; V11.8&#xff1a; https://pan.baidu.com/s/11272Cldde_2UttQkWS2MlQ 提取码&#xff1a;0p3j 2&#xff08;另一版本&#xff09;第十版 v13.2&#xff1a; ht…

信息系统项目管理师(第四版)教材精读思维导图-第九章项目范围管理

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图PDF格式 本章思维导图XMind源文件 目录 9.1 管理基础 9.2 管理过程 9.3 规划范…

【Linux】线程安全-信号量

文章目录 信号量原理信号量保证同步和互斥的原理探究信号量相关函数初始化信号量函数等待信号量函数释放信号量函数销毁信号量函数 信号量实现生产者消费者模型 信号量原理 信号量的原理&#xff1a;资源计数器 PCB等待队列 函数接口 资源计数器&#xff1a;对共享资源的计…

Python之单调栈

单调栈 了解单调栈先要了解栈。栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶&#xff0c;相对地&#xff0c;把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈&…

用JAVA(springboot) 开发的彩票模拟系统

闲暇时间&#xff0c;自己写了一个模拟彩票系统&#xff0c;里面研究了开奖算法&#xff0c;下单算法&#xff0c;彩票的各种计算规则。需要源码的私信&#xff0c;研究为主&#xff0c;切勿商务用途。

2022年06月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;有多少种二叉树 输入n(1<n<13)&#xff0c;求n个结点的二叉树有多少种形态 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 整数n 输出 答案 样例输入 3 样例输出 5 这个问题可以使用…

外部中断(EXTI) - 按键控制LED

一、外部中断/事件控制器(EXTI)结构图 1、结构图分析 外部中断主要由外部中断/事件控制器(External interrupt/event controller, EXTI)控制&#xff0c;它管理了外部中断或者事件的使能与否、触发方式等功能。 &#xff08; 外部中断/事件控制器(EXTI)结构图 &#xff09; …

记录错误:Access denied for user ‘root‘@‘localhost‘ (using password:No) 解决方案

他说我没输入密码&#xff0c;但是我输入了啊&#xff1f;&#xff1f;于是&#xff0c;我试了试这儿&#xff0c;password 一改就好了。。。 他原来是是我打的很快&#xff0c;快速生成的。。。。

ESP32之LEDC(PWM信号的输出)

一、PWM信号简介 PWM&#xff1a;脉冲宽度调制&#xff0c;简称脉宽调制频率(f)&#xff1a;一秒钟PWM有多少个周期(单位Hz)周期(T)&#xff1a;一个周期的时间占空比(duty)&#xff1a;在一个脉冲周期内&#xff0c;高电平的时间与整个周期时间的比例脉宽时间&#xff1a;一个…

React 中的 ref 如何操作 dom节点,使输入框获取焦点

聚焦文字输入框 .focus() 获取焦点 当用户点击按钮时&#xff0c;handleClick 函数会被调用&#xff0c;从而将焦点聚焦到文本输入框上。 // 焦文字输入框 import { useRef } from "react";const FocusForm () > {const inputRef useRef<any>(null);func…

C到C++的升级

C和C的关系 C继承了所有C语言的特性&#xff1b;C在C的基础上提供了更多的语法和特性&#xff0c;C语言去除了一些C语言的不好的特性。C的设计目标是运行效率与开发效率的统一。 变化一&#xff1a;所有变量都可以在使用时定义 C中更强调语言的实用性&#xff0c;所有的变量…

内网隧道代理技术(二十二)之 CS针对特定端口上线不出网机器

CS工具自带上线不出网机器 如图A区域存在一台中转机器,这台机器可以出网,这种是最常见的情况。我们在渗透测试的过程中经常是拿下一台边缘机器,其有多块网卡,边缘机器可以访问内网机器,内网机器都不出网。这种情况下拿这个边缘机器做中转,就可以使用CS工具自带上线不出网…

代码随想录Day_53打卡

①、最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…

Flutter状态管理 — 探索Flutter中的状态

前言 随着响应式编程的理念&Flutter被大众所了解以来&#xff0c;状态管理一直是一个引人深思的话题。如果想要学习好Flutter这样的响应式的编程框架就一定是离不开状态管理的。我遇到过很多没有了解过响应式编程框架的&#xff0c;或者从事后端开发&#xff0c;自己想用F…