附詳細注釋
#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 回車...