-->
当前位置:首页 > 题库

函数题:求解任务分配问题(优先队列式分支限界法)

Luz4年前 (2022-05-25)题库533
有n(1<=n<=20)个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务,每个人执行各个任务的成本不同,裁判程序中数组c中c[i][j]表示第(i+1)个人执行第(j+1)个任务的成本。

求出总成本最小的分配方案。

裁判程序使用优先队列式分支限界法搜索最优解,需要实现如下函数

### 函数接口定义:
c++
void bound(NodeType &e); //求结点e关于总成本的限界值
void bfs(); // 优先队列式搜索排列树


### 裁判测试程序样例:
c++
在这里给出函数被调用进行测试的例子。例如:
#include <iostream>
#include <queue>
#include <vector>
#include <limits>

using namespace std;

#define MAXN 21
int n; // 元素个数
//成本表示
int c[MAXN][MAXN];

vector<int> bestx; // 最优解
int mincost = numeric_limits<int>::max(); // 最优解的成本

struct NodeType //队列中的结点类型
{
int i; //当前结点在搜索空间中的层次
vector<int> x; //当前结点包含的解向量(排列结果)
vector<bool> used; //当前各元素是否已用于排列的情况
int cost = 0; //当前排列对应成本总和
int lb; //lower bound,下界,理想情况下最小总成本,不一定能实现
bool operator<(const NodeType &s) const //重载<关系函数
{
return lb>s.lb; // 默认最大堆,反序后下界lb最小的先出队
}
};

priority_queue<NodeType> qu; //优先队列用于搜索各个结点

void bound(NodeType &e); //求结点e关于总成本的限界值
void bfs(); // 优先队列式搜索排列树

int main()
{

//输入
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin>>c[i][j];

bfs(); // 优先队列式搜索排列树,延用队列式搜索中的函数名bfs

cout<<mincost<<endl;

return 0;
}

/* 请在这里填写答案 */


### 输入格式:
第1行输入人数n。接下来输入n行,一行对应一个人执行任务的成本,每行n个数,对应一个人执行第1、2、3、...、n个任务的成本。

### 输出格式:
各种任务分配方案中的最小总成本。

### 输入样例:

在这里给出一组输入。例如:

in
4
9 2 7 8
6 4 3 7
5 8 1 8
7 6 9 4


### 输出样例:

在这里给出相应的输出。例如:

out
13







答案:若无答案欢迎评论