AcWing 861. 二分图的最大匹配-代码注释-golang
原题链接
简单
作者:
望哥
,
2020-07-16 20:46:43
,
所有人可见
,
阅读 520
package main
import(
"fmt"
"bufio"
"os"
)
const N=510
const M=100010
var reader = bufio.NewReader(os.Stdin)
var writer = bufio.NewWriter(os.Stdout)
// 邻接表
var(
e [M]int
ne [M]int
h [N]int
idx = 0
)
// 邻接表插入
func insert(a,b int){
idx++
e[idx] = b
ne[idx] = h[a]
h[a] = idx
}
var match [N]int // 匹配状态, 女孩 匹配了 那一个男生
var st [N]bool // 一轮状态
func find(x int) bool{
for i:=h[x];i>0;i=ne[i]{
t:=e[i]
if !st[t]{
st[t] = true // 这一轮,这个女孩 t 被标记匹配了
if match[t] == 0 || find(match[t]) { // 尝试让原来找到匹配女孩的男生重新匹配其他女孩(同一轮中)
match[t] = x // 女孩t匹配了男生x (可能是被迫调整了匹配)
return true
}
}
}
return false
}
func main(){
var n1,n2,m int
var u,v int
fmt.Fscan(reader, &n1, &n2, &m)
for i:=0;i<m;i++{
fmt.Fscan(reader, &u,&v)
insert(u,v)
}
res:=0
// 循环对每一个男生进行匹配
for i:=1;i<=n1;i++{
for j:=1;j<=n2;j++{ // 重置一轮的状态
st[j] = false
}
if find(i){
res++
}
}
fmt.Println(res)
}