深入理解数据结构——划分子集算法

#include <iostream>
#include <string>

using namespace std;

typedef int EType;     // 自定义链表的数据元素为整数。


//定义队列顺序存储结构
struct Queue
{
	QType* element;          // 存放结点的数据元素。
	int front;				//对头节点
	int rear;				//队尾节点
	int maxsize;			//队列最大容量
};

//构造空队列算法
void CreatQueue(Queue& Q, int MaxQueueSize) {
	Q.maxsize = MaxQueueSize;
	Q.element = new QType[Q.maxsize];
	Q.front = 0;
	Q.rear = 0;
}

//判断队列是否为空
bool IsEmpty(Queue& Q) {
	if (Q.front == Q.rear) return true;
	return false;
}

//判断队列是否满了front=rear+1;
bool IsFull(Queue& Q) {
	if (Q.front == (Q.rear + 1) % (Q.maxsize + 1)) return true;
	return false;
}

//返回队头元素的值
bool GetFront(Queue& Q, QType& result) {
	//将font后面一个位置的队列元素的值取出
	if (IsEmpty(Q)) return false;
	result = Q.element[(Q.front + 1) % (Q.maxsize + 1)];
	return true;
}

//返回队尾元素的值
bool GetRear(Queue& Q, QType& result) {
	//将font后面一个位置的队列元素的值取出
	if (IsEmpty(Q)) return false;
	result = Q.element[(Q.rear + 1) % (Q.maxsize + 1)];
	return true;
}


//进队运算
//将一个新的的元素x存储到当前rear所指空间的下一个位置,首先要判断队列是否为满了
bool EnQueue(Queue& Q, QType& x) {
	if (IsFull(Q)) return false;
	Q.rear = (Q.rear) % (Q.maxsize + 1); //rear指向空间
	Q.element[Q.rear] = x;//存入x
	return true;
}

//出队运算
//将front所指空间的下一个位置的元素取出,首先要判断队列是否为空
bool OutQueue(Queue& Q, QType& result) {
	if (IsEmpty(Q)) return false;
	Q.front = (Q.front + 1) % (Q.maxsize + 1); //front指向空间的下一个位置
	result = Q.element[Q.front];
	return true;
}

struct QType {
	int ProjectNumber;
};

void Division(int *r[],int set[], int n) {
	//n个项目划分不冲突的字节,冲突关系再r数组中
	Queue Q;
	QType x;
	int rearkeep;//项目编号
	int current;

	int setindex;//子集编号
	int MaxQueueSize;

	CreatQueue(Q, MaxQueueSize);

	for (int i = 1; i < n;i++) {
		//项目编号进队,结果输出话状态数组
		x.ProjectNumber = 1;
		EnQueue(Q, x);
		set[i] = 0;
	}
	setindex = 1;//子集编号

	while (!IsEmpty(Q)) {
		rearkeep = Q.rear;//保留当前队尾指针
		OutQueue(Q, x);//出队当前进入子集的第一个项目编号
		current = x.ProjectNumber;
		set[current] = setindex;//第一个进入信自己的项目改变状态数组值
		while (!(Q.front==rearkeep)) {//当前队列中的所有项目舱室进入当前子集
			OutQueue(Q, x);//出队下一个项目

			current = x.ProjectNumber;
			for (int i = 1; i <= n; i++) {
				//current与已经入的当前子集的所有项目比较,是否发生冲突
				if (setindex == set[i] && r[current][i]) {
					x.ProjectNumber = current;
					EnQueue(Q, x);  //current重新入队
					break;
				}
				if (i > n) set[current] = setindex;//current进入当前子集
			}
			setindex++;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南叔先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值