匈牙利算法golang 实现

460 阅读1分钟
package main
import (
   "fmt"
)
func main() {
   nodes := [][]int{{1,5},{1,7},{2,5},{3,5},{3,6},{4,7},{4,8}}
   graph := make(map[int][]int)
   for _,v := range nodes{
      from, to := v[0]-1, v[1]-1
      graph[from] = append(graph[from], to)
   }
   n := 8
   matching := make([]int, n)
   check := make([]bool, n)
   for i := range matching {
      matching[i] = -1
   }
   var dfs func(u int) bool
   dfs = func(u int) bool {
      nodes := graph[u]
      for _,v := range nodes {
         if !check[v] {
            check[v] = true
            if matching[v] == -1 || dfs(matching[v]) {
               matching[v] = u
               matching[u] = v
               return true
            }
         }
      }
   return false
   }
   var hungarian func()
   hungarian = func(){
      ans := 0
      for u:=0;u<n/2;u++{
         if matching[u] == -1 {
            for i:= range check {
               check[i] = false
            }
            if dfs(u) {
               ans++
            }
         }
      fmt.Println(check)
      fmt.Printf("match: %v\n", matching)
      }
   fmt.Println(ans)
   }
   hungarian()
}