自動排班系統1 0

2021-06-29 15:34:07 字數 2854 閱讀 9302

附詳細注釋
#include #include #include #include #include #include #include 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

store_member[100];

//貪心階段幹部的排序,按照空餘時間段少的先安排的策略排序

bool cmp(member a, member b)

//初始化

void initialize()

//核心演算法,通過設定1個超級源點和1個超級匯點,並把從源點流出和流入源點的值設定為1,從而確保每一班都有乙個人值

int edmonds_karp(int source, int target)//源點,匯點

}} //說明已經找不到增廣路了

if (max_flow[target] == 0)break;

//更新操作

for (int u = target; u != source; u = pre[u])

ans += max_flow[target];

} return ans;

}//最後排班資訊顯示

void display()

} //建圖

//初始化,預設兩點間有通路為1,無通路為0。

memset(capacity, 0, sizeof(capacity));

//超級源點為0,超級匯點為member_amount+period_amount+1

//超級源點到每個幹部間連一條權值為1的邊,代表每個幹部值1班

for (int i = 1; i <= member_amount; i++)

//每班到超級匯點之間連一條權值為1的邊,從而先確保每一班保證有乙個幹部值

for (int i = member_amount+1; i <= end_node-1; i++)

for (int i = 1; i <= member_amount; i++) }

//呼叫ek演算法,先確保每一班有一人值。

int check=edmonds_karp(start_node, end_node);

//check用來檢驗是否能夠保證每班至少1人,若不等於班數則代表不可以確保,不過這種情況幾乎不可能發生

/*此處或許可以更加嚴密,如出現這種情況,就讓某些幹部值兩班,出現這種情況,只要將源點到每個幹部的權值設為2

保留每個班次到匯點的權值為1,細節部分需要稍作修改*/

if (check != period_amount)

//給已經分配好的值班確認關係

for (int i = member_amount + 1; i <= end_node - 1;i++)

}} //處理已經分配好的幹部和對應班的關係

for (int i = 1; i <= member_amount; i++)

}} //貪心階段

for (int i = 1; i <= member_amount; i++) }

//按照自定義的貪心策略排序

sort(store_rest.begin(), store_rest.end(), cmp);

int p, minn,cnt;

//p用來記錄該幹部的哪個可值班中現有人數最少的那個班的序號

//minn用來記錄,該幹部可值班中最小的現有人數

for (int i = 0; i < store_rest.size(); i++)//迴圈剩下的幹部

else break;

}if (cnt < minn)

}//更新

reflect[store_rest[i].no] = p;

for (int k = 0; k < 10; k++)

} } //顯示

display();

system("pause");

return 0;

}

測試樣例一:

測試樣例二:

測試樣例三:(改變了二的輸入順序,內容一樣)

考勤排班 考勤管理系統的好處有哪些?

對於企業hr來說,尤其是人員眾多的企業,最讓人到頭疼的事情就是員工考勤排班的管理了,需要花費大量的時間,對大量的資料量進行核算,太容易出現錯漏了。而且考勤排班與工資掛鉤,搞不好,要有很多糾紛的。採用考勤管理系統可以極大緩解此類問題,提高hr的考勤排班效率,規範考勤排班制度,做到公平公正。每家企業的考...

win10系統如何關掉系統自動更新

越來越多的電腦使用者都在使用windows10系統,儘管系統是一代代更新的,但難免有槽點,windows10系統也不例外,最大的槽點就是 自動更新 的功能。當然,自動更新 的功能也是相當有用處的。windows 10系統更新是強制的並不能真正關閉 關閉update服務可以臨時阻止更新,但是有發現關閉...

如何關閉WIN10系統自動更新

已經關閉了windows update 但是仍然存在兩種情況 有的時候在開機後 發現windows update 由禁用模式自動變為手動模式 windows update屬性中已經把恢復選項卡中的第一次失敗 更改為 無操作 有以下幾種的方法 家庭版系統 windows r,輸入 regedit 回車...