函数题:求解任务分配问题(优先队列式分支限界法)
有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
答案:若无答案欢迎评论
求出总成本最小的分配方案。
裁判程序使用优先队列式分支限界法搜索最优解,需要实现如下函数
### 函数接口定义:
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
答案:若无答案欢迎评论