您的位置:首页 > 编程语言 > C#

匈牙利算法的C#实现版本

2008-04-01 20:50 330 查看
算法的原理:

範例:

有四位教授被分派開設四門課程,如何指派使所需的總準備時間為最小。已知個人對各課程之準備時間如下表所示:

課程1

課程2

課程3

課程4

教授A

2

10

9

7

教授B

15

4

14

8

教授C

13

14

16

11

教授D

4

15

13

9

解法:

Step 1. 在各列中找最小值,將該列中各元素檢去此值,對各行重複一次。

0

8

7

5

本列各減2

11

0

10

4

本列各減4

2

3

5

0

本列各減11

0

11

9

5

本列各減4

0

8

2

5

11

0

5

4

2

3

0

0

0

11

4

5

本欄各減0

本欄各減0

本欄各減5

本欄各減0

Step 2. 檢驗各列,對碰上之第一個零,做記號,同列或同欄的其他零則畫X (由零較少的列先做,可不依順序)

0

8

2

5

11

0

5

4

2

3

0

0

0

11

4

5

Step 3. 檢驗可否完成僅含零的完全指派,若不能,則畫出最少數目的垂直與水平的刪除線來包含所有的零至少一次。

0

8

2

5

11

0

5

4

2

3

0

0

0

11

4

5

Step 4. 找出未被畫線的元素中之最小值 K,將含有此些未被畫線的元素的各列所有元素減去K (Step 4.1),若造成負值,則將該欄加上K (Step 4.2)。形成新矩陣後回到Step 2.

Step 4.1

-2

6

0

3

11

0

5

4

2

3

0

0

-2

9

2

3

Step 4.2

0

6

0

3

13

0

5

4

4

3

0

0

0

9

2

3

形成新矩陣

Step 2.

0

6

0

3

13

0

5

4

4

3

0

0

0

9

2

3

由上表知,指派順序為 (2,2), (4,1), (1,3), (3,4),可得到完全指派。

課程1

課程2

課程3

課程4

教授A

9

教授B

4

教授C

11

教授D

4

總準備時間為 9+4+11+4 = 28 為最佳解。

算法的实现代码

1using System.Collections.Generic;

2using System.Drawing;

3

4namespace ConsoleApplication1

5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: