文章目录

  • 6、批处理作业调度(排列树)
  • 7、最大团问题
  • 8、图的m着色问题

6、批处理作业调度(排列树)

每一个作业Ji都有两项任务分别在2台机器上完成。每个作业必须先有机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理时间。则所有作业在机器2上完成处理时间和f=F2i,称为该作业调度的完成时间和。


也就是f1[i]=上一步的使用时间+自己消耗的时间,f2[i]=max(当前在机器1上的时间,上一步的使用时间)+自己消耗的时间。
详细的解释见参考文章

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int x[100];//当前的作业调度顺序
int bestx[100];//最优的调度顺序
int m[100][100];//各作业所需的处理时间
int f1,f2=0;//机器1、2完成时间
int bestf=1000;//最短完成时间
int cf=0,n;//当前完成时间和
Swap(int &a,int &b)
{int t=a;a=b;b=t;
}
void BackTrace(int t)
{if(t>n){if(cf<bestf){for(int i=1; i<=n; i++)bestx[i]=x[i];bestf=cf;}}else{for(int i=t; i<=n; i++){f1+=m[x[i]][1];int tempf=f2;//保存的是上一个作业在f2的时间f2=(f1>f2?f1:f2)+m[x[i]][2];cf+=f2;if(cf<bestf)//超过最优时间就没必要继续了{Swap(x[t],x[i]);//回到上一个位置BackTrace(t+1);//再继续向下找Swap(x[t],x[i]);//得到一个最优后就要回溯}f1-=m[x[i]][1];cf-=f2;f2=tempf;}}
}
int main()
{int i,j;cout<<"请输入作业数:"<<endl;cin>>n;cout<<"请输入在各机器上的处理时间"<<endl;for(i=1; i<=2; i++) //i从1开始for(j=1; j<=n; j++)cin>>m[j][i];//第j个作业,第i台机器的时间值for(i=1; i<=n; i++)x[i]=i;//初始化当前作业调度的一种排列顺序BackTrace(1);cout<<"调度作业顺序:"<<endl;for(i=1; i<=n; i++)cout<<bestx[i]<<' ';cout<<endl;cout<<"处理时间:"<<endl;cout<<bestf;return 0;
}
/*
输入:
3
2 3 2
1 1 3
输出:
调度作业顺序:
1 3 2
处理时间:
18
*/

7、最大团问题

先看视频
理解后再看文章链接
总结: i从1开始向下找,如果i与当前所有解中有一个没有边,那么i不能放入解中,x[i]=0;否则cn++且x[i]=1。由于是深度优先搜索,所以先判断是否能进入左子树,能则(即x[i]=1)cn++,递归下一层且回退时cn–,不能则用限界函数判断是否需要进入右子树,cn+n-i>bestn时表示不选择当前的结点也可能获得更好的bestn,所以可以进入右子树。

#include <iostream>
using namespace std;
int m[100][100];//有向图的邻接矩阵
int x[100],bestx[100];//当前团的解 最优解
int n;//表示图的顶点数
int cn=0,bestn;//当前团的大小 当前最优值
void getbestn(int i)
{if(i>n) //递归出口,到根节点时,更新最优值和最优解,返回{bestn=cn;//更新最优值for(int j=1; j<=n; j++)bestx[j]=x[j];return ;//返回}x[i]=1;//先假定x[i]=1;for(int j=1; j<i; j++){if(x[j]==1&&m[i][j]==0)//如果该点与已知解中的点无边相邻{x[i]=0;break;//则不遍历左子树}}if(x[i]==1) //当且仅当x[i]==1时,遍历左子树{cn++;//该点加入当前解getbestn(i+1);//递归调用cn--;//还原当前解}if(cn+n-i>bestn) //如果当前值+右子树可能选择的节点>当前最优解则可以遍历右子树,否则无需继续进行{x[i]=0;getbestn(i+1);}return ;
}
int main()
{cin>>n;//输入图的顶点数//输入图的邻接矩阵for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)cin>>m[i][j];//求最优解getbestn(1);cout<<bestn<<endl;//输出最优值//输出for(int i=1; i<=n; i++)if(bestx[i])cout<<i<<" ";//输出最优解return 0;
}
/*
输入:
5
0 1 0 1 1
1 0 1 0 1
0 1 0 0 1
1 0 0 0 1
1 1 1 1 0
输出:
3
1 2 5
*/

8、图的m着色问题

先看视频链接
再看文章链接
总结: i从第一个节点开始,其颜色j从1到m种颜色中找,如果找到一个不会和相连结点重复的颜色,则color[j]++(第j种颜色被用过),同时递归下一层,没找到时回退同时color[j]–、i的颜色归0。到达叶节点时更新bestn、bestx[]。
代码:

#include<iostream>
using namespace std;
int c[100][100]; //邻接矩阵
int x[100],bestx[100];  //当前顶点i的颜色 最终节点i的颜色
int cn,bestn,m,n; //cn记录方案数 n个顶点 m种颜色
int color[100]; //color[i]!=0表示第i号颜色被用到过
int Check(int k)    //检查第k个顶点的颜色是否满足条件
{for(int i=1; i<=k; i++){if(c[k][i]==1&&x[i]==x[k]) //k与i之间相连并且i顶点的颜色与k顶点的颜色相同return 0;}return 1;
}void GraphColor(int i)
{if(i>n)  //到达叶结点{cn=0;for(int j=1; j<=m; j++){if(color[j]) cn++;}if(bestn>cn||bestn==0)//出现更小的bestn{//更新最大颜色数bestn=cn;for(int j=1; j<=n; j++)bestx[j]=x[j];}}else{for(int j=1; j<=m; j++){x[i]=j;   //首先将这个顶点颜色换为iif(Check(i)==1)  //检查是否符合条件{color[j]++;//满足则颜色数++GraphColor(i+1); //走下一步color[j]--;}x[i]=0;  //回溯 置为0}}
}int main()
{int a,b;cin>>n>>m;//邻接表for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)cin>>c[i][j];//从第一个节点开始GraphColor(1);//输出各点的颜色for(int j=1; j<=n; j++)cout<<bestx[j]<<' ';cout<<endl;//总颜色数cout<<bestn;return 0;
}
/*
输入
5 4
0 1 1 1 0
1 0 1 1 1
1 1 0 1 0
1 1 1 0 1
0 1 0 1 0输出
4 3 2 1 4
4
*/

算法设计与分析——第五章回溯法 批处理作业调度 + 最大团问题+图的m着色问题相关推荐

  1. [XJTUSE 算法设计与分析] 第五章 回溯法

    第五章 回溯法 填空题会有代码填空,大题会手动回溯 学习要点 理解回溯法的深度优先搜索策略. 掌握用回溯法解题的算法框架 (1)递归回溯 (2)迭代回溯 (3)子集树算法框架 (4)排列树算法框架 5 ...

  2. 算法设计与分析第5章 回溯法(二)【回溯法应用】

    第5章 回溯法 5.2 应用范例 1.0-1背包问题 有n件物品和一个容量为c的背包.第i件物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和 ...

  3. 算法设计与分析第5章 回溯法(一)【回溯法】

    第5章 回溯法 5.1 回溯法 1.回溯法的提出  有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法. 2. 问题的解空间 (1)问题的解向量:回溯法希望 ...

  4. 计算机算法设计与分析第五章思维导图知识点总结 ( 初稿 )

    复习链接 计算机算法设计与分析第一章思维导图 计算机算法设计与分析第二章思维导图&&知识点总结 计算机算法设计与分析第三章思维导图&&知识点总结 计算机算法设计与分析第 ...

  5. 算法设计与分析第七章分支限界算法(完结篇)

    算法设计与分析第七章分支限界算法 一.分支界限算法概述 1.分支限界法类似于回溯法,是一种在问题的解空间树上搜索问题解的算法. 分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解 ...

  6. PHP第五周答案,算法设计与分析第五周作业——Word Ladder

    算法设计与分析第五周作业--Word Ladder 上周找了一道深度搜索优先搜索的算法题来做,于是这周就选了一道广度优先搜索算法题来试试手. 本周所选题目:原题目链接 题目详情 题目大意:给出一个字符 ...

  7. educoder算法设计与分析 实验五回溯法

    实验五 回溯法 第1关:排列 第2关:子集合 第3关:TSP问题 第4关:n皇后问题 第5关:0-1背包 第1关:排列 题目描述: 1.设计算法从前m个大写字母(m≤26)种取出n个字母的所有排列(组 ...

  8. 算法设计与分析 实验五 算法综合实验

    实验5.<算法综合实验> 一.实验目的 理解和复习所学各种算法的概念 掌握和复习所学各种算法的基本要素 掌握各种算法的优点和区别 通过应用范例掌握选择最佳算法的设计技巧与策略 二.实验内 ...

  9. 算法设计与分析第3章 贪心算法

    第4章 贪心算法 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 贪心算法的基本要素 1.贪心选择性质 所谓贪心选择性质是指所 ...

最新文章

  1. 使用内存盘 格式化文件系统以及部署ceph-osd
  2. sqlserver 新建只读权限用户
  3. Linux内核中的IPSEC实现(7)
  4. linux 内核网络协议栈
  5. 【清华集训2017】榕树之心
  6. cjson调用的实例 c++
  7. SequoiaDB 巨杉数据库
  8. php引用类,thinkphp引用类的使用
  9. 直播软件自动化测试,基于SRS-Bench工具的直播平台性能测试
  10. 算法笔记--二分图判定
  11. element的表格index自定义_vue+element-ui实现表格编辑的三种实现方式
  12. 只会用console.log调试?快来试试这些高效的调试方法
  13. 时间旅行java_[ 一起学React系列 -- 7 ] 秘术之时间旅行-2
  14. Linux命令解释之yum
  15. 如何理解Linux shell中的“21”?
  16. Python学习心得--变量类型篇
  17. Android Button设置
  18. sql注入总结(一)
  19. Docker容器启动报WARNINGIPv4 forwarding
  20. 《大魔术师》:给内地闹剧变个“魔术”

热门文章

  1. TIA博途_通过PEEK指令在TP900触摸屏上实现监控所有IO地址的具体方法示例
  2. 20200722-Java面经-被血虐-面试问题及总结
  3. Xshell6下载与安装
  4. c语言字符串去重用指针,用几条shell命令快速去重10G数据
  5. 安卓开发常用icon/png图样
  6. vue element Pagination分页组件二次封装
  7. C++ 时间函数整理详解
  8. 【转】开发者需要了解的领域特定语言(DSL)
  9. 20145212罗天晨 恶意代码分析
  10. Android 收发彩信(MMS)