第一版链接:http://blog.csdn.net/david_jett/article/details/44928667
更新说明:
将输入优化了下,不必再输入干部数和总班数,比较排序部分采用了冒泡排序。
代码:
#include <iostream>
#include <cstdio>
#include <queue>
#include <string.h>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>
using namespace std;
#define arraySize 200 //中心干部不超过100,每周班数最多50
#define inf 1000000000//无穷大
int capacity[arraySize][arraySize], flow[arraySize][arraySize], max_flow[arraySize], pre[arraySize];
//capacity存储点之间最大流量,flow存储点之间当前已经流过的流量
//max_flow存储每次遍历过程中的值,pre记录查找过程中每个节点的前一节点,用于后续更新
int reflect[100];
//用于标记干部值哪班,初始值为0,代表还未分配值班时间
int period_info[60][10];
//每班由哪些人来值
int member_amount, period_amount, tmp, start_node, end_node;
//干部数量,班的数量,临时变量,超级源点,超级汇点
//干部对象,No-干部对应序号,name-姓名,period_amount可值班数,store_period存储可以值的班对应的序号,干部不超过100人
class member
{
public:
int No;
string name;
int period_amount;
vector <int> store_period;
//为冒泡那里修改的拷贝函数
member()
{
}
member (const member & x)
{
No=x.No;
name=x.name;
period_amount=x.period_amount;
store_period=x.store_period;
}
}store_member[100];
//贪心阶段干部的排序,按照空余时间段少的先安排的策略排序
bool cmp(member a, member b)
{
return a.period_amount < b.period_amount;
}
//初始化
void Initialize()
{
//初始化干部值班对应关系
memse