最优化方法

一. 图论

1.最小生成树

图的生成树是它的一颗含有其所有顶点的无环连通子图,一 幅加权图的最小生成树(MST)是它的一颗权值(树中的所有边的权值之和) 最小的生成树
• 适用场景:道路规划、通讯网络规划、管道铺设、电线布设等

题目数据
kruskal算法
稀疏图,按边大小排序

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e3+3,maxm=2e5+5;int n,m;
struct node{int fr,to,val;inline bool operator<(node b)const {return val<b.val;}
}e[maxm<<1];
int k,fa[maxn];
inline void add(int x,int y,int z){e[++k]=(node){x,y,z};}inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);
}
int main()
{scanf("%d %d",&n,&m);int x,y,z;for(int i=1;i<=m;i++) {scanf("%d %d %d",&x,&y,&z);add(x,y,z);add(x,y,z);//无向图 }sort(e+1,e+k+1); //边排序for(int i=1;i<=n;i++)fa[i]=i;//并查集初始化int cnt=0,ans=0;for(int i=1;i<=k;i++){int x=find(e[i].fr),y=find(e[i].to);if(x!=y){fa[x]=y;//连边ans+=e[i].val;++cnt;if(cnt==n-1)break;}}if(cnt==n-1)printf("%d",ans);else puts("orz");//图不连通return 0;
}

prim
稠密图

#include<bits/stdc++.h>
#define re return
#define inc(i,l,r) for(int i=l;i<=r;++i)
using namespace std;const int maxn=5e3+3,maxm=2e5+5;
int inf=5e8;
int n,m,d[maxn][maxn],dis[maxn],vis[maxn];
int main()
{// freopen("a.in","r",stdin);scanf("%d %d",&n,&m);int x,y,z;inc(i,1,n)inc(j,1,n)d[i][j]=inf;inc(i,1,m){scanf("%d %d %d",&x,&y,&z);d[x][y]=d[y][x]=min(d[x][y],z);}vis[1]=1;//将1号点加入图中 inc(i,2,n)dis[i]=d[1][i];//dis初始化为1到各个点之间的最短距离 int ans=0,cnt=n-1;while(cnt--)//需要进行n-1次循环 {int now,minn=inf;inc(i,1,n)if(!vis[i]&&dis[i]<minn)minn=dis[i],now=i;//找当前最短距离点 nowif(minn==inf){printf("orz");re 0;}   vis[now]=1;ans+=dis[now];inc(i,1,n)dis[i]=min(dis[i],d[now][i]);}printf("%d",ans);re 0;
}

2.网络流

通常可以把这些边想象成道路,流量就是这条道 路的车流量,容量就是道路可承受的最大的车流量 • 适用场景:企业生产运输问题、交通拥堵优化问题等

最大流
题目数据

#include<bits/stdc++.h>
#define re return
#define inc(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
template<typename T>inline void rd(T&x)
{char c;bool f=0;while((c=getchar())<'0'||c>'9')if(c=='-')f=1;x=c^48;while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);if(f)x=-x;
}
const int maxn=1e4+4,maxm=1e5+5; 
int n,m,hd[maxn],s,t;
struct node{int to,nt,w;
}e[maxm<<1];
int k=1;
inline void add(int x,int y,int z)
{e[++k]=(node){y,hd[x],z};hd[x]=k;e[++k]=(node){x,hd[y],0};hd[y]=k;
}int deep[maxn],cur[maxn];
inline bool bfs()
{inc(i,1,n)deep[i]=0;deep[s]=1;queue<int>q;q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=hd[x];i;i=e[i].nt){int v=e[i].to;if(!deep[v]&&e[i].w){deep[v]=deep[x]+1;if(v==t)re 1;q.push(v);}}}re 0;
}inline int dfs(int x,int flow)
{if(x==t)re flow;int delta=flow;for(int &i=cur[x];i;i=e[i].nt){int v=e[i].to;if(deep[v]==deep[x]+1&&e[i].w){int d=dfs(v,min(e[i].w,delta));e[i].w-=d;e[i^1].w+=d;delta-=d;if(!delta)re flow;}}re flow-delta;
}
int main()
{rd(n),rd(m),rd(s),rd(t);int x,y,w;inc(i,1,m){rd(x),rd(y),rd(w);add(x,y,w);}int ans=0;while(bfs()){inc(i,1,n)cur[i]=hd[i];ans+=dfs(s,2147483647);}printf("%d",ans);re 0;
}

最小费用最大流
最大流量的基础上要求最小的费用,有边权值
题目数据

#include<bits/stdc++.h>
#define re return
#define inc(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
template<typename T>inline void rd(T&x)
{char c;bool f=0;while((c=getchar())<'0'||c>'9')if(c=='-')f=1;x=c^48;while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);if(f)x=-x;
}
const int maxn=5e3+3;int k=1,n,m,s,t;
int dis[maxn],ord[maxn],hd[maxn],flow[maxn],vis[maxn];
int smoney,sflow;struct node{int flow,to,nt,cost;
}e[100005];
inline void add(int u,int v,int w,int f)
{e[++k].to=v;e[k].nt=hd[u];e[k].flow=w;e[k].cost=f;hd[u]=k;
}inline bool spfa()
{queue<int>q;memset(dis,0x3f3f3f3f,sizeof dis);memset(vis,0,sizeof vis);q.push(s);dis[s]=0;flow[s]=0x3f3f3f3f;while(!q.empty()){int x=q.front();q.pop();vis[x]=0;for(int i=hd[x];i;i=e[i].nt){int v=e[i].to,w=e[i].flow,f=e[i].cost;if(w&&dis[v]>dis[x]+f){if(!vis[v]){vis[v]=1;q.push(v);}flow[v]=min(flow[x],w);dis[v]=dis[x]+f;ord[v]=i;}}}re dis[t]!=0x3f3f3f3f;
}inline void vivi()
{int x=t;while(x!=s){int i=ord[x];e[i].flow-=flow[t];e[i^1].flow+=flow[t];x=e[i^1].to;}sflow+=flow[t];smoney+=flow[t]*dis[t];
}
int main()
{
//	freopen("a.in","r",stdin);rd(n),rd(m),rd(s),rd(t);int u,v,w,f;inc(i,1,m){rd(u),rd(v),rd(w),rd(f);add(u,v,w,f);add(v,u,0,-f);}while(spfa())vivi();printf("%d %d",sflow,smoney);re 0;
}

3.最短路

主要包括Dijkstra算法和Floyd算法两种,用于求解 两点间的最短距离 • 适用场景:路径规划问题,如修建道路、设定救援路线等
题目数据
在这里插入图片描述

spfa

单源最短路
容易被卡

#include<bits/stdc++.h>
#define re return
#define inc(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
template<typename T>inline void rd(T&x)
{char c;bool f=0;while((c=getchar())<'0'||c>'9')if(c=='-')f=1;x=c^48;while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);if(f)x=-x;
}const int maxn=1e4+5,maxm=5e5+5;
int n,m,hd[maxn];
struct node{int to,nt,val;
}e[maxm<<1];
int k,s;
inline void add(int x,int y,int z){e[++k]=(node){y,hd[x],z};hd[x]=k;
}#define ll long long
ll inf=2147483647,dis[maxn],vis[maxn];
inline void spfa()
{inc(i,1,n)dis[i]=inf;dis[s]=0;queue<int>q;q.push(s);while(!q.empty()){int x=q.front();q.pop();vis[x]=0;for(int i=hd[x];i;i=e[i].nt){int v=e[i].to;if(dis[v]>dis[x]+e[i].val){dis[v]=dis[x]+e[i].val;if(!vis[v]){vis[v]=1;q.push(v);    }}}}
}int main()
{// freopen("a.in","r",stdin);rd(n),rd(m),rd(s);int x,y,z;inc(i,1,m){rd(x),rd(y),rd(z);add(x,y,z);}spfa();inc(i,1,n)printf("%lld ",dis[i]);re 0;
}

dijsktra

单源最短路
无负边

#include<bits/stdc++.h>
#define re return
#define inc(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
template<typename T>inline void rd(T&x)
{char c;bool f=0;while((c=getchar())<'0'||c>'9')if(c=='-')f=1;x=c^48;while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);if(f)x=-x;
}const int maxn=1e4+5,maxm=5e5+5;
int n,m,hd[maxn];
struct node{int to,nt,val;
}e[maxm<<1];
int k,s;
inline void add(int x,int y,int z){e[++k]=(node){y,hd[x],z};hd[x]=k;
}#define ll long long
ll inf=2147483647,dis[maxn];
struct KKK{
int x,val;
inline bool operator<(KKK u)const 
{re val>u.val;
}
};
inline void dij()
{inc(i,1,n)dis[i]=inf;dis[s]=0;priority_queue<KKK>q;q.push((KKK){s,0});while(!q.empty()){KKK u=q.top();q.pop();int x=u.x;if(dis[x]!=u.val)continue;for(int i=hd[x];i;i=e[i].nt){int v=e[i].to;if(dis[v]>dis[x]+e[i].val){dis[v]=dis[x]+e[i].val;q.push((KKK){v,dis[v]});}}}
}int main()
{//freopen("a.in","r",stdin);rd(n),rd(m),rd(s);int x,y,z;inc(i,1,m){rd(x),rd(y),rd(z);add(x,y,z);}dij();inc(i,1,n)printf("%lld ",dis[i]);re 0;
}

floyd

O(n^3)
多源最短路

#include<bits/stdc++.h>
using namespace std;
#define inf 1234567890
#define maxn 10005
inline int read()
{int x=0,k=1; char c=getchar();while(c<'0'||c>'9'){if(c=='-')k=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();return x*k;
}//快读
int a[maxn][maxn],n,m,s;
inline void floyd()
{for(int k=1;k<=n;k++)//这里要先枚举k(可以理解为中转点){for(int i=1;i<=n;i++){if(i==k||a[i][k]==inf){continue;}for(int j=1;j<=n;j++){a[i][j]=min(a[i][j],a[i][k]+a[k][j]);//松弛操作,即更新每两个点之间的距离//松弛操作有三角形的三边关系推出//即两边之和大于第三边}}}
}
int main()
{n=read(),m=read(),s=read();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){a[i][j]=inf;}}//初始化,相当于memset(a,inf,sizeof(a))for(int i=1,u,v,w;i<=m;i++){u=read(),v=read(),w=read();a[u][v]=min(a[u][v],w);//取min可以对付重边}floyd();a[s][s]=0;for(int i=1;i<=n;i++){printf("%d ",a[s][i]);}return 0;
}

二、动态规划

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

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

相关文章

oracle单个用户最大连接数限制

项目经理反馈&#xff0c;现场已做了单个用户的最大连接数2000的限制&#xff0c;但数据库还是报无法连接&#xff0c;故障用户的连接数已3800多了。 查看日志报错如下 2023-07-20T13:07:57.79465308:00 Process m000 submission failed with error 20 Process m000 submiss…

HDFS的设计目标和重要特性

HDFS的设计目标和重要特性 设计目标HDFS重要特性主从架构分块存储机制副本机制namespace元数据管理数据块存储 设计目标 硬件故障(Hardware Failure)是常态&#xff0c;HDFS可能有成百上千的服务器组成&#xff0c;每一个组件都有可能出现故障。因此古见检测和自动快速恢复的H…

梯度提升树的基本思想

目录 1. 梯度提升树 VS AdaBoost 2. GradientBoosting回归与分类的实现 2.1 GradientBoosting回归 2.2 GradientBoosting分类 1. 梯度提升树 VS AdaBoost 梯度提升树&#xff08;Gradient Boosting Decision Tree&#xff0c;GBDT&#xff09;是提升法中的代表性算法&#…

帆软报表设计器设置步骤

1、连接工作目录&#xff08;可以是远程服务器&#xff09; 在打开的界面中设置具体的远程地址 一个报表文件可以有多个数据集、但是数据集依附于报表文件的存在&#xff0c;不能跨报表共享。 先补充这么多&#xff0c;有遇到问题再写一点。 &#xff08;完&#xff09;

Cpp 01 — namespace命名空间、C++的输入与输出、缺省参数、函数重载、引用、隐式类型转换

前言&#xff1a;本文章主要用于个人复习&#xff0c;追求简洁&#xff0c;感谢大家的参考、交流和搬运&#xff0c;后续可能会继续修改和完善。 因为是个人复习&#xff0c;会有部分压缩和省略。 一、namespace命名空间 C使用命名空间(namespace)来避免命名冲突。 在定义一个…

STM32CUBUMX配置RS485(中断接收)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…

Vue mixin 混入

可以复用的组件&#xff0c;我们一般会抽离&#xff0c;写成公共的模块。 可以复用的方法&#xff0c;我们一般会抽离&#xff0c;写成公共的函数。 那么 在 Vue 中&#xff0c;如果 某几个组件实例 VueComponent 中、或者 整个 Vue 项目中 都存在相同的配置&#xff0c;那就…

firefox笔记-Centos7离线安装firefox

目前&#xff08;2023-03-22 16:41:35&#xff09;Centos7自带的firefox已经很新了是2020年的。主要原因是有个web项目&#xff0c;用2020年的firefox打不开。 发到互联网上是2023-07-24。 报错是js有问题&#xff0c;估计是搞前端的只做了chrome适应&#xff0c;没做firefox…

Spring使用注解进行对象装配(DI)

文章目录 一. 什么是对象装配二. 三种注入方式1. 属性注入2. 构造方法注入3. Setter注入 三. 三种注入方式的优缺点四. 综合练习 通过五大类注解可以更便捷的将对象存储到 Spring 中&#xff0c;同样也可以使用注解将已经储存的对象取出来&#xff0c;直接赋值到注解所在类的一…

ATTO488 NHS ester ,新型亲水性荧光标记物,具有良好的水溶性

陕西新研博美生物科技有限公司MISS.wu小编&#xff08;2023.7月26日&#xff09;为大家整理以下的内容&#xff1a; Atto488-NHS是一种新型亲水性荧光标记物&#xff0c;具有良好的水溶性。这种染料表现得很浓吸收、高荧光量子产率以及优异的热稳定性和光稳定性。因此&#xff…

亚马逊、速卖通,阿里国际等平台测评如何用自养号测评补单

在电商领域&#xff0c;补单是一种常见的推广方式。它能够优化商品销售、留下优质评论、打压竞品和赶走跟卖等&#xff0c;具有很多好处。然而&#xff0c;补单也存在安全性问题&#xff0c;有些卖家找人补单后店铺反而出了问题。因此&#xff0c;了解测评系统是非常重要的的。…

android9-android13 AMS演进初窥

目录 一&#xff1a;概览 WindowManagerService 基本介绍 ActivityManagerService 基本介绍 二&#xff1a;AMS及其关联的WMS中主要组件的类图和对像图 一&#xff1a;android 9中AMS/WMS的类图和对像图 二&#xff1a;android 10中AMS/WMS的类图和对像图 三&#xff1a…

关于应用在Google Play的元数据优化

应用标题中的关键词权重最大&#xff0c;其次是简短描述中的关键词&#xff0c;最后是长描述关键词&#xff0c;了解这些就能够很好的提高应用的可见度&#xff0c;下载量和整体成功率。 1&#xff0c;标题。 Google Play最多允许标题容纳30个字符&#xff0c;关键词的频率和密…

盘点!项目管理软件排行榜前十名

如今企业规模不断扩大&#xff0c;业务逐渐复杂化&#xff0c;项目管理已经成为现代企业管理中不可或缺的一环。作为协调管理者、团队成员和客户之间交流的工具&#xff0c;项目管理软件不仅可以提高工作效率&#xff0c;还可以提高项目成功的几率&#xff0c;对于企业具有重要…

Unity进阶--对象池数据场景管理器笔记

文章目录 泛型单例类泛型单例类&#xff08;不带组件版&#xff09;对象池管理器数据管理器场景管理器 泛型单例类 using System.Collections; using System.Collections.Generic;public abstract class ManagersSingle<T> where T : new() {private static T instance;…

DevExpress WPF Tree List组件,让数据可视化程度更高!(一)

DevExpress WPF Tree List组件是一个功能齐全、数据感知的TreeView-ListView混合体&#xff0c;可以把数据信息显示为REE、GRID或两者的组合&#xff0c;在数据绑定或非绑定模式下&#xff0c;具有完整的数据编辑支持。 DevExpress WPF 拥有120个控件和库&#xff0c;将帮助您…

验证码登录如何实现?

手机验证码登录 1、需求分析2、数据模型3、代码开发-交互过程4、代码开发-准备工作5、代码开发-修改LoginCheckFilter6、代码开发-接口开发7、前端代码介绍8、启动测试 1、需求分析 为了方便用户登录&#xff0c;移动端通常都会提供通过手机验证码登录的功能。 手机验证码登录…

手边酒店多商户版小程序V1.0.47 全开源版 安装测试教程

手边酒店多商户小程序是基于框架应用模块应用&#xff0c;需要框架基础上使用&#xff0c;总体体验了一下功能还是强大&#xff0c;非常合适酒店及民宿类小程序搭建。小程序端支持多店版支持平台入驻。手边酒店多商户版只有模块版&#xff0c;无独立版本&#xff0c;该版本核心…

Rust vs Go:常用语法对比(十)

题图来自 Rust vs. Golang: Which One is Better?[1] 182. Quine program Output the source of the program. 输出程序的源代码 package mainimport "fmt"func main() { fmt.Printf("%s%c%s%c\n", s, 0x60, s, 0x60)}var s package mainimport "fm…

桥梁安全生命周期监测解决方案

一、方案背景 建筑安全是人们生产、经营、居住等经济生活和人身安全的基本保证&#xff0c;目前我国越来越多的建筑物逐 步接近或者已经达到了使用年限&#xff0c;使得建筑物不断出现各种安全隐患&#xff0c;对居民的人身安全和财产安全产 生不利影响&#xff0c;因此房…