考场安排---图的着色原理之运用

考场安排
姓名:杨小华 
【问题描述】
设学校共有n门课,需要进行期末考试,因为不少学生不止选修一门课程,所以不能把
同一个学生选修的两门课程安排在同一场次进行考试,问学期的期末考试最少需多少场次考
完?(提示:如果两门课被同一个同学选上,则表示这两门课的顶点之间存在一条边)。
试设计一算法,当给定一个图时G=(V,E),|V|=n,(V i,V jЄE,当且仅当有一个同学选了课程i和课程j,试给出一个考试安排方案N 1,N 2,N 3…Nk,N sNt(s≠t,1≤s,t≤k)且V=N i(1≤i≤k)。
【问题分析】
本问题可转换成是对一平面图的顶点着色问题判定,既采用回溯法求解。将所选的每门课程变成一个结点,若一个同学选了m(1≤m≤n)门课程时,则这m门课程所对应的结点互相用一条边连接起来。则相邻边的顶点不能着同一种颜色,既不能安排在同一场次考试。但本题又不同于m-着色问题,而是要求最少场次考完,故本问题是求min-着色问题,既所有的顶点最少可用多少种颜色来着色,则本问题可解。
【数据结构】
图的邻接矩阵test[ MAX][ MAX]来表示一个图G,其中若(i,j)是G的一条边,则test[i][j]= test[j] [i] =1,否则test[i][j]= test[j] [i] =0,因为本问题只关心一条边是否存在,所以用邻接矩阵。颜色总数用总课程数目表示。生成解则用数组value[ MAX]来记录,其中value[ i]是结点i的颜色,既课程i可安排在第value[ i]场考试,result[ MAX]用来记录最优解。程序中N表示课程总数,minSum表示最少的考试场次。
【算法设计与分析】
函数init()是从testArrange.in中读取数据,并建立对应的邻接矩阵,对于本程序所给出的样例第一组数据的邻接矩阵为图1,平面图为图2。
函数nextValue(k)是生成下一种颜色,进入此过程前value[ 1] ,value[ 2]……value[ k-1]以分得了颜色且相邻边的结点有不同的颜色。本过程在区域[1,N]中给value[k]确定一个值,如果还剩下一些颜色,它们与结点K邻接的结点分配的颜色不同,那么就将其中最高标值的颜色分配给结点K,如果没有剩下一些颜色,则置value[ k]=0。
函数testArrange()是考试方案的一个递归回溯算法,它计算并找出最少场次解。如果没有可用的颜色了,则回溯。给结点K分配颜色后,此时统计已分配的颜色数目,如果大于minSum的值,则进行剪枝,并回溯。在最初调用testArrange(1)之前,以对图的邻接矩阵置初值并对数组value[ MAX]置0值。                                                                                                                                      <
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值