匈牙利算法的Java语言实现
生活随笔
收集整理的這篇文章主要介紹了
匈牙利算法的Java语言实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
匈牙利算法的一個重要概念是增廣路徑,具體思路是對于圖的每個頂點都尋找其增廣路徑,然后將其加入匹配頂點當中,而對于每個頂點A尋找增廣路徑的過程中,如果另一個頂點B和頂點A有連接且在此輪循環中沒有被訪問過,則進行下一步處理:如果頂點B沒有匹配的頂點或者雖然有匹配的頂點但是能找出另一個匹配的頂點C而把當前匹配的頂點讓給頂點A,則把頂點A和頂點C匹配,而頂點B也在遞歸的過程中更改了匹配頂點,如此下去。關于匈牙利算法還有一個重要的定理:如果從一個頂點A出發,沒有找到增廣路徑,那么無論再從別的點出發找到多少增廣路徑來改變現在的匹配,從A出發都永遠找不到增廣路徑。所以后面頂點的處理對前面頂點的處理沒有影響。具體代碼如下:
public class Hungary {int[][] graph; //需要計算的圖的鄰接矩陣,注意每個頂點和它自己的連接被設置成了0。另外graph需要是n*n的矩陣int[] match; //記錄每個頂點的匹配頂點。假如match[0]=1,就是說頂點0和頂點1已經匹配int len; //圖的頂點的個數boolean[] used; //在從每個頂點搜索其增廣路徑的循環中,記錄每個頂點是否已經被訪問過public Hungary(int[][] graph) {this.graph = graph;len = graph.length;used = new boolean[len];match = new int[len];for (int i = 0; i < len; i++) {match[i] = -1;used[i] = false;}}//尋找頂點x的增廣路徑。如果能夠尋找到則返回true,否則返回false。//匈牙利算法一個重要的定理:如果從一個頂點A出發,沒有找到增廣路徑,那么無論再從別的點出發找到多少增廣路徑來改變現在的匹配,從A出發都永遠找不到增廣路徑boolean findAugmentPath(int x) {for (int i = 0; i < len; i++) {if (graph[x][i] == 1) { //頂點x和頂點i之間有連接。需要注意的一點是我們在輸入需要計算的圖的鄰接矩陣的時候把對角線上的元素設置為0if (!used[i]) { //如果頂點i還未訪問used[i] = true;//如果頂點i還未匹配,或者與頂點i匹配的那個頂點可以換個頂點匹配(也就是說可以把頂點i“讓給”當前頂點x),則把頂點x和頂點i為對方的匹配頂點//由于上一步已經將頂點i設置成used,所以findAugmentPath(match[i])不會再考慮頂點i了if (match[i] == -1 || findAugmentPath(match[i])) {match[x] = i;match[i] = x;System.out.println(x + "------>" + i);return true;}}}}return false;}void search() {//對于每個頂點都循環處理for (int i = 0; i < len; i++) {if (match[i] == -1) { //如果當前頂點已經有匹配的頂點了,就略過此頂點clearUsed(); //新的一輪搜索,把used數組設置成falseSystem.out.println("開始匹配頂點" + i);findAugmentPath(i);}}System.out.println();System.out.println();System.out.println();for (int i = 0; i < len; i++) {System.out.println(i + "------>" + match[i]);}}void clearUsed() {for (int i = 0; i < len; i++) {used[i] = false;}}public static void main(String[] args) {int[][] graph = {{0, 0, 0, 0, 1, 0, 1, 0},{0, 0, 0, 0, 1, 0, 0, 0},{0, 0, 0, 0, 1, 1, 0, 0},{0, 0, 0, 0, 0, 0, 1, 1},{1, 1, 1, 0, 0, 0, 0, 0},{0, 0, 1, 0, 0, 0, 0, 0},{1, 0, 0, 1, 0, 0, 0, 0},{0, 0, 0, 1, 0, 0, 0, 0}};new Hungary(graph).search();} }總結
以上是生活随笔為你收集整理的匈牙利算法的Java语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《挑战程序设计竞赛(疑惑)》19.2九宫
- 下一篇: “Why Should I Trust