算法设计与分析-分支限界

问题A: 分支限界法-单源最短路径问题

题目描述

 已知一个加权有向图(为了计算方便,假设编号为1的顶点是入度为0的源点,编号为n的顶点是出度为0的汇点,图中的顶点从1开始编号),要求计算图中从源点出发到汇点的最短距离及其对应的路径(逆向输出)。

输入

第1行输入两个整数,分别表示图G中顶点数n和边数m。
第2 - m+1行每行输入三个整数,分别表示顶点i和顶点j的编号以及由这两个顶点的有向边上的权。

输出

第1行输出源点到汇点的最短路径距离。
第2行输出汇点到源点的逆向最短路径。

样例输入

 复制

5 7
1 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60
样例输出

 复制

60
5 3 4 1
提示
#include <stdio.h>#define INFINITY  65535
#define MaxSize 100 //顺序队列最大长度 int n;  //图中的顶点个数 
int m; //图中的边的个数 
int a[20][20];//邻接矩阵 
int label[20]; // 存储源点到其余顶点最短路径上的最后一个顶点编号,0号单元不用
int distance[20]; // 存储从源点出发到其余各个顶点的最短距离,0号单元不用 void CreateGraph() {int i,j,u,v,w;for(i=1; i<=n; i++){ // 初始化邻接矩阵for(j=1; j<=n; j++) a[i][j] = INFINITY;}for(i=1; i<=m; i++) { // 输入边信息填写有向图的邻接矩阵scanf("%d %d %d",&u,&v,&w);  // 边的信息包括顶点1和顶点2的编号以及它们之间的距离a[u][v]=w;}
}typedef struct {int length; // 存储源点到此顶点的当前距离 int i; //存储顶点在图中的编号 
} QNode; //存放解空间树中的结点数据typedef struct { //存放结点的顺序循环队列QNode Q[MaxSize];int front,rear;
} SqQueue;void InitQueue(SqQueue &sq) { //队列初始化sq.front=0;sq.rear=0;
}int QueueEmpty(SqQueue sq) {	//判断队列是否为空if(sq.front==sq.rear) {return 1;} else {return 0;}
}int QueueFull(SqQueue sq) { //判断队列是否为满if(sq.front==(sq.rear+1)%MaxSize) {return 1;} else {return 0;}
}void EnQueue(SqQueue &sq, QNode e) { //入队if(!QueueFull(sq)) {sq.Q[sq.rear]=e;sq.rear=(sq.rear+1)%MaxSize;} else {printf("Error:queue is full\n");}
}void DeQueue(SqQueue &sq, QNode &e) { //出队if(!QueueEmpty(sq)) {e=sq.Q[sq.front];sq.front=(sq.front+1)%MaxSize;} else {printf("Error:queue is empty\n");}
}void BB() {//从顶点1开始 SqQueue sq;InitQueue(sq);QNode e;e.length=0;e.i=1; // 构造根结点EnQueue(sq,e);while(!QueueEmpty(sq)) {DeQueue(sq,e);int i=e.i;int length=e.length;for(int j=1;j<=n;j++){if(a[i][j]<INFINITY && length+a[i][j]<distance[j]){________________________}} 	}
}int main(void) {scanf("%d %d",&n,&m);CreateGraph();for(int i=1; i<=n; i++){ // 初始化源点到各个顶点的距离 distance[i]=INFINITY;}distance[1]=0; // 源点编号为1 label[1]=0; // 表示1号顶点没有前驱结点 BB();printf("%d\n",distance[n]);for(int u=n; u!=0; u=label[u]) printf("%d ",u);return 0;
}
#include <stdio.h>#define INFINITY  65535
#define MaxSize 100 //顺序队列最大长度 int n;  //图中的顶点个数 
int m; //图中的边的个数 
int a[20][20];//邻接矩阵 
int label[20]; // 存储源点到其余顶点最短路径上的最后一个顶点编号,0号单元不用
int distance[20]; // 存储从源点出发到其余各个顶点的最短距离,0号单元不用 void CreateGraph() {int i,j,u,v,w;for(i=1; i<=n; i++){ // 初始化邻接矩阵for(j=1; j<=n; j++) a[i][j] = INFINITY;}for(i=1; i<=m; i++) { // 输入边信息填写有向图的邻接矩阵scanf("%d %d %d",&u,&v,&w);  // 边的信息包括顶点1和顶点2的编号以及它们之间的距离a[u][v]=w;}
}typedef struct {int length; // 存储源点到此顶点的当前距离 int i; //存储顶点在图中的编号 
} QNode; //存放解空间树中的结点数据typedef struct { //存放结点的顺序循环队列QNode Q[MaxSize];int front,rear;
} SqQueue;void InitQueue(SqQueue &sq) { //队列初始化sq.front=0;sq.rear=0;
}int QueueEmpty(SqQueue sq) {	//判断队列是否为空if(sq.front==sq.rear) {return 1;} else {return 0;}
}int QueueFull(SqQueue sq) { //判断队列是否为满if(sq.front==(sq.rear+1)%MaxSize) {return 1;} else {return 0;}
}void EnQueue(SqQueue &sq, QNode e) { //入队if(!QueueFull(sq)) {sq.Q[sq.rear]=e;sq.rear=(sq.rear+1)%MaxSize;} else {printf("Error:queue is full\n");}
}void DeQueue(SqQueue &sq, QNode &e) { //出队if(!QueueEmpty(sq)) {e=sq.Q[sq.front];sq.front=(sq.front+1)%MaxSize;} else {printf("Error:queue is empty\n");}
}void BB() {//从顶点1开始 SqQueue sq;InitQueue(sq);QNode e;e.length=0;e.i=1; // 构造根结点EnQueue(sq,e);while(!QueueEmpty(sq)) {DeQueue(sq,e);int i=e.i;int length=e.length;for(int j=1;j<=n;j++){if(a[i][j]<INFINITY && length+a[i][j]<distance[j]){distance[j]=length+a[i][j];label[j]=i;e.length=distance[j];e.i=j;EnQueue(sq,e);}} 	}
}int main(void) {scanf("%d %d",&n,&m);CreateGraph();for(int i=1; i<=n; i++){ // 初始化源点到各个顶点的距离 distance[i]=INFINITY;}distance[1]=0; // 源点编号为1 label[1]=0; // 表示1号顶点没有前驱结点 BB();printf("%d\n",distance[n]);for(int u=n; u!=0; u=label[u]) printf("%d ",u);return 0;
}

问题B: 分支限界法-0-1背包问题

题目描述

给定n种物品和一背包。物品i (1≤i≤n) 的重量是wi (wi > 0),其价值为vi (vi > 0),背包的容量为c (c > 0)。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 

输入

第1行输入两个整数分别表示物品的数量和背包容量。
第2行输入n个整数分别表示每个物品的重量。
第3行输入n个整数分别表示每个物品的获利。

输出

第1行输出整个背包的最大获利。

样例输入

 复制

3 50
45 25 25
28 15 15
样例输出

 复制

30
提示
 
 
#include <stdio.h> // 为了方便编写限界函数,假设按照单位重量获利递增的顺序输入每个物品的重量和获利。 #define MaxSize 100 //最多节点数 int n; //物品数量 int c; //背包容量 int w[MaxSize]; //依次存放各个物品的重量,0号单元不用 int v[MaxSize]; //依次存放各个物品的价值,0号单元不用 int bestx[MaxSize]; //存放程序执行过程中已经找到的当前最优解,0号单元不用 int bestv=0; //存放程序执行过程中已经找到的当前最优值 typedef struct { int cw; // 当前已放物品的重量 int cv; // 当前已放物品的获利 int i; //当前在解空间树中的层数,假设根结点是第1层 int x[MaxSize]; // 当前解向量 } QNode; //存放解空间树中的节点数据 typedef struct { //存放节点的顺序循环队列 QNode Q[MaxSize]; int front,rear; } SqQueue; void InitQueue(SqQueue &sq) { //队列初始化 sq.front=0; sq.rear=0; } int QueueEmpty(SqQueue sq) { //判断队列是否为空 if(sq.front==sq.rear) { return 1; } else { return 0; } } int QueueFull(SqQueue sq) { //判断队列是否为满 if(sq.front==(sq.rear+1)%MaxSize) { return 1; } else { return 0; } } void EnQueue(SqQueue &sq, QNode e) { //入队 if(!QueueFull(sq)) { sq.Q[sq.rear]=e; sq.rear=(sq.rear+1)%MaxSize; } else { printf("Error:queue is full\n"); } } void DeQueue(SqQueue &sq, QNode &e) { //出队 if(!QueueEmpty(sq)) { e=sq.Q[sq.front]; sq.front=(sq.front+1)%MaxSize; } else { printf("Error:queue is empty\n"); } } void BB() { SqQueue sq; InitQueue(sq); // 构造根结点 QNode e; e.cw=0; e.cv=0; e.i=1; EnQueue(sq,e); while(!QueueEmpty(sq)) { DeQueue(sq,e); if(e.i==n+1) {// 处理解空间树中的叶子结点 if(e.cv>=bestv){ bestv=e.cv; for(int j=1; j<=n; j++) { bestx[j]=e.x[j]; } } } else { // 处理解空间树中的非叶子结点 //处理左孩子,要该物品 QNode le=e; ___________ le.i++; // 准备好进入下一层 if(le.cw<=c) { // 如果满足约束条件 EnQueue(sq,le); } //处理右孩子,不要该物品 QNode re=e; _____________ re.i++; // 准备好进入下一层 EnQueue(sq,re); } } } int main(void) { scanf("%d %d",&n,&c); for(int i=1; i<=n; i++) { scanf("%d",&w[i]); } for(int i=1; i<=n; i++) { scanf("%d",&v[i]); } BB(); printf("%d\n",bestv); return 0; }
#include <stdio.h>// 为了方便编写限界函数,假设按照单位重量获利递增的顺序输入每个物品的重量和获利。#define MaxSize 100	//最多节点数int n; //物品数量
int c; //背包容量int w[MaxSize];	//依次存放各个物品的重量,0号单元不用 
int v[MaxSize];	//依次存放各个物品的价值,0号单元不用
int bestx[MaxSize];	//存放程序执行过程中已经找到的当前最优解,0号单元不用
int bestv=0; //存放程序执行过程中已经找到的当前最优值typedef struct {int cw; // 当前已放物品的重量int cv; // 当前已放物品的获利int i; //当前在解空间树中的层数,假设根结点是第1层int x[MaxSize]; // 当前解向量
} QNode; //存放解空间树中的节点数据typedef struct { //存放节点的顺序循环队列QNode Q[MaxSize];int front,rear;
} SqQueue;void InitQueue(SqQueue &sq) { //队列初始化sq.front=0;sq.rear=0;
}int QueueEmpty(SqQueue sq) { //判断队列是否为空if(sq.front==sq.rear) {return 1;} else {return 0;}
}int QueueFull(SqQueue sq) { //判断队列是否为满if(sq.front==(sq.rear+1)%MaxSize) {return 1;} else {return 0;}
}void EnQueue(SqQueue &sq, QNode e) { //入队if(!QueueFull(sq)) {sq.Q[sq.rear]=e;sq.rear=(sq.rear+1)%MaxSize;} else {printf("Error:queue is full\n");}
}void DeQueue(SqQueue &sq, QNode &e) { //出队if(!QueueEmpty(sq)) {e=sq.Q[sq.front];sq.front=(sq.front+1)%MaxSize;} else {printf("Error:queue is empty\n");}
}void BB() {SqQueue sq;InitQueue(sq);// 构造根结点QNode e;e.cw=0;e.cv=0;e.i=1;EnQueue(sq,e);while(!QueueEmpty(sq)) {DeQueue(sq,e);if(e.i==n+1) {// 处理解空间树中的叶子结点if(e.cv>=bestv){bestv=e.cv;for(int j=1; j<=n; j++) {bestx[j]=e.x[j];}}	} else { // 处理解空间树中的非叶子结点//处理左孩子,要该物品QNode le = e;  le.x[e.i] = 1; // 选择当前物品  le.cw += w[e.i]; // 更新当前重量  le.cv += v[e.i]; // 更新当前价值  le.i++; // 准备好进入下一层  if (le.cw <= c) { // 如果满足约束条件  EnQueue(sq, le);  }  // 处理右孩子,不要该物品  QNode re = e;  // re.x[e.i] 已经是0,因为是从e复制过来的  re.i++; // 准备好进入下一层  EnQueue(sq, re);  }}
}int main(void) {scanf("%d %d",&n,&c);for(int i=1; i<=n; i++) {scanf("%d",&w[i]);}for(int i=1; i<=n; i++) {scanf("%d",&v[i]);}BB();printf("%d\n",bestv);return 0;
}

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

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

相关文章

武汉理工大学云计算与服务计算——6.虚拟化技术习题

20世纪60年代IBM公司推出虚拟化技术 虚拟化技术的核心思想是利用软件或固件管理程序构成虚拟化层&#xff0c;把物理资 源映射为虚拟资源。 在虚拟资源上可以安装和部署多个虚拟机&#xff0c;实现多用户 共享物理资源。 1&#xff0e;虚拟化技术在云计算中的哪些地方发挥了关…

SpringBoot图书管理系统【附:资料➕文档】

前言&#xff1a;我是源码分享交流Coding&#xff0c;专注JavaVue领域&#xff0c;专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享&#xff0c;定制和毕业设计服务&#xff01; 免费获取方式--->>文章末尾处&#xff01; 项目介绍048&#xff1a; 图…

自然语言处理(NLP)—— 符号方法与符号语言

1. 符号方法 1.1 雅各布森的结构主义 雅各布森的结构主义是一种语言学理论&#xff0c;它强调了语言结构中的两个基本维度&#xff1a;轴与范畴。这两个维度是理解雅各布森结构主义的核心概念。 1.1.1 轴向对立 句法轴&#xff08;Syntagmatic Axis&#xff09;&#xff1a;这…

【ARM Cache 与 MMU 系列文章 7.7 – ARMv8/v9 MMU Table 表分配原理及其代码实现 1】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 MMU Table 表分配原理及其代码实现虚拟地址空间 Region的配置系统物理地址位宽获取汇编代码实现MMU Table 表分配原理及其代码实现 假设当前系统中需要映射多个region,其中第一个要映…

【Linux】进程4——进程状态

1.进程状态 什么是状态&#xff1f; 每个人都有状态——颓废&#xff0c;阳光&#xff0c;积极向上。。。。 进程也有状态 在操作系统中&#xff0c;由于进程的数量是非常多的&#xff0c;而系统的资源又非常少&#xff0c;所以不可能每一个进程在每时每刻都会处于上处理机运…

【python报错】list indices must be integers or slices, not tuple

【Python报错】list indices must be integers or slices, not tuple 在Python中&#xff0c;列表&#xff08;list&#xff09;是一种常用的数据结构&#xff0c;用于存储一系列的元素。当你尝试使用不支持的索引类型访问列表元素时&#xff0c;会遇到list indices must be in…

OS复习笔记ch7-3

承接上文我们讲完了页式管理和段式管理&#xff0c;接下来让我们深入讲解一下快表和二级页表 快表 快表和计算机组成原理讲的Cache原理如出一辙。为了减少访存的次数&#xff0c;OS在访问页面的时候创建了快表&#xff08;Translation Lookaside Buffer &#xff0c;简称TLB&…

pikachu靶场全流程

目录​​​​​​​ 暴力破解&#xff1a; 1.基于表单的暴力破解&#xff1a; 2.验证码绕过(on server)&#xff1a; 3.验证码绕过(on client)&#xff1a; token防爆破&#xff1a; XSS&#xff1a; 1.反射型xss(get)&#xff1a; 2.反射性xss(post)&#xff1a; 3.存…

354. 俄罗斯套娃信封问题

Problem: 354. 俄罗斯套娃信封问题 文章目录 思路解题方法复杂度Code 思路 这个问题可以转换为最长递增子序列&#xff08;Longest Increasing Subsequence&#xff0c;LIS&#xff09;问题。先对信封按宽度升序排序&#xff0c;当宽度相同时&#xff0c;按高度降序排序。然后在…

Elasticsearch之写入原理以及调优

1、ES 的写入过程 1.1 ES支持四种对文档的数据写操作 create&#xff1a;如果在PUT数据的时候当前数据已经存在&#xff0c;则数据会被覆盖&#xff0c;如果在PUT的时候加上操作类型create&#xff0c;此时如果数据已存在则会返回失败&#xff0c;因为已经强制指定了操作类型…

RPA影刀 | 设置当前时间

1. 新建流程 2. 创建指令 指令1&#xff1a;获取当前日期时间 指令3&#xff1a;日期时间转文本 %Y&#xff1a;年 %m&#xff1a;月 %d&#xff1a;日期 其他字符自由添加。 常用格式如下&#xff1a; %Y年%m月%d日%Y-%m-%d%Y_%m_%d%Y%m%d 3. 运行流程

【办公类-04-02】华为助手导出照片读取拍摄时间分类导出,视频不行)

背景需求 今天我用QQ相册导出照片&#xff0c;但是始终在转圈&#xff0c;手机上无法跳出“连结“”的提示&#xff0c;换了台式和笔记本都无法传输。&#xff08;明明5月14日还可以导出的&#xff09; 最后我只能用华为传输助手&#xff0c;把照片快速提取出来了。 使用原来…

从记忆到想象:探索AI的智能未来

引言 人工智能&#xff08;AI&#xff09;在信息处理、数据分析和任务自动化等方面展现了强大的能力。然而&#xff0c;在人类独有的记忆和想象力领域&#xff0c;AI仍然有很长的路要走。加利福尼亚大学戴维斯分校的心理学和神经科学教授查兰兰加纳特&#xff08;Charan Ranga…

STM32编程:实现LED灯闪烁(基于手写SDK的方式)

项目结构 stm32f10x.h 文件 //寄存器的值常常是芯片外设自动更改的&#xff0c;即使CPU没有执行程序&#xff0c;也有可能发生变化 //编译器有可能会对没有执行程序的变量进行优化//volatile表示易变的变量&#xff0c;防止编译器优化&#xff0c; #define __IO volati…

算法训练营day50

题目1&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int rob(vector<int>& nums) {vector<int> dp(nums.size(), 0);dp[0] nums[0];if(nums.size() < 2) return dp[0];dp[1] max(nums[0],nums[1]);for(int…

Linux(Rocky)下 如何输入中文(切换中文输入法)教程

RockyLinux如何输入中文&#xff08;切换中文输入法&#xff09; 注意 在字符画界面的Linux系统中 默认不具备中文输入法的功能 需要SSH或其他远程工具来实现 问题 可能大家有的时候安装了一个虚拟机之后 想切换中文输入法 但是一直找不到方法 下面将利用Rocky9.2作为演示…

Failed to build causal-conv1d -- 离线安装(mamba_ssm)

Building wheels for collected packages: causal-conv1d Building wheel for causal-conv1d (setup.py) … error error: subprocess-exited-with-error python setup.py bdist_wheel did not run successfully. │ exit code: 1 ╰─> [8 lines of output] torch.__versi…

苹果将推出“Apple Intelligence”AI系统,专注于隐私和广泛应用|TodayAI

据彭博社报道&#xff0c;苹果公司将在下周的 WWDC 2024 开发者大会上揭晓其全新的 AI 系统——“Apple Intelligence”&#xff0c;该系统将适用于 iPhone、iPad 和 Mac 设备。这一新系统将结合苹果自身技术和 OpenAI 的工具&#xff0c;为用户提供一系列新的 AI 功能&#xf…

独立游戏之路 -- TapTap广告收益损失和常见问题

一个操作带来的TapTap广告收益损失 一,收益损失1.1 广告入口1.2 损失对比二,常见问题2.1 有展现量没有预估收益 /eCPM 波动大?2.2 新建正式媒体找不到预约游戏2.3 聚合模式由于没有回传 oaid 无数据2.4 每日观看次数限制是否有限制一,收益损失 1.1 广告入口 TapTap广告联…

【JAVASE】日期与时间类(下)

三&#xff1a;LocalDateTime 相当于LocalDate类&#xff0c;在LocalDateTime类的对象中还可以封装时、分、秒和纳秒&#xff08;1纳秒是1秒的十亿分之一&#xff09;等时间类型。 例如&#xff0c;创建LocalDateTime对象 &#xff0c; LocalDateTime date LocalDateTi…