附详细注释
#include <iostream>
#include <cstdio>
#include <queue>
#include <string.h>
#include <vector>
#include <string>
#include <algorithm>
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人
struct member
{
int No;
string name;
int period_amount;
vector <int> store_period;
}store_member[100];
//贪心阶段干部的排序,按照空余时间段少的先安排的策略排序
bool cmp(member a, member b)
{
return a.period_amount < b.period_amount;
}
//初始化
void Initialize()
{
//初始化干部值班对应关系
memset(reflect, 0, sizeof(reflect));
//初始化班存储的干部信息
memset(period_info, 0, sizeof(period_info));
}
//核心算法,通过设置1个超级源点和1个超级汇点,并把从源点流出和流入源点的值设置为1,从而确保每一班都有一个人值
int Edmonds_Karp(int source, int target)//源点,汇点
{
//初始化
queue <int> store;
int cur;
//ans最大流 此处用于返回看能否保证每一班一个人
int ans=0;
//cur当前节点
//flow存储的是两个点之间的流量,用于后