GO语言最大流求解二分图最大匹配问题|青训营笔记

63 阅读2分钟

遇到的问题: 1、由于所有语句必须在函数中,所以无法通过 := 声明全局变量,全局变量只能通过 var 进行声明 var A int = 1

2、:=会创建局部变量

3、实现队列:

//创建
stack := make([]int, 0)
//push
stack = append(stack, 10)
//pop
V := stack[0]
stack = stack[1:len(stack)-1]
//检查栈空
len(stack)==0

4、go的append都是尾部插入

5、切片slice:a[a:b]从a位置连续b长度的数组

6、函数返回值:多参数、单参数

//单个返回值
func func_name(a, b int) int { //同类型,可以省略  a, b int
    return a + b
}

//多个返回值
func func_name(a, b int) (c int, err error) {  //返回值还可以是   (int, error)
    return a+b, nil
}

func SumAndProduct(A, B int) (int, int) {
    return A+B, A*B
}

7、if-else 必须加大括号

8、没有 !low 的形式

9、go居然不提供整数的min函数,只提供浮点数的min函数

10、Scanf换行读入有问题

求最大匹配源码

package algorithm

import "fmt"

type edge struct {
	u    int
	next int
	rong int
	liu  int
}

const maxm int = 200010
const maxn int = 1010
const inf int = 0x3f3f3f3f

var e [maxm]edge
var vis [maxn]int
var dep [maxn]int
var head [maxn]int
var cnt int = 0

func Init() {
	for i := 0; i < maxn; i++ {
		head[i] = -1
	}
}

func add(u int, v int, rong int) {
	e[cnt].u = v
	e[cnt].next = head[u]
	e[cnt].rong = rong
	head[u] = cnt
	e[cnt].liu = 0
	cnt = cnt + 1
}

func adde(u, v, rong int) {
	add(u, v, rong)
	add(v, u, 0)
}

func bfs(s int, t int) bool {
	for i := 0; i <= t; i++ {
		vis[i] = 0
		dep[i] = inf
	}
	q := make([]int, 0)
	q = append(q, s)
	vis[s] = 1
	dep[s] = 0
	for len(q) > 0 {
		u := q[0]

		if len(q) > 1 {
			q = q[1:]
		} else {
			q = nil
		}
		vis[u] = 0
		//fmt.Print(dep[u], "\n")
		for i := head[u]; i != -1; i = e[i].next {
			//fmt.Print("spfa:", u, " ", e[i].u, " ", e[i].rong, " ", e[i].liu, " ", dep[e[i].u], "\n")
			if e[i].rong > e[i].liu && dep[e[i].u] > dep[u]+1 {
				dep[e[i].u] = dep[u] + 1
				if vis[e[i].u] == 0 {
					q = append(q, e[i].u)
					vis[e[i].u] = 1
				}
			}
		}
	}
	//fmt.Print(dep[t], "\n")
	return dep[t] != inf
}

func Min(x, y int) int {
	if x < y {
		return x
	}
	return y
}

func dfs(u, t, low int) int {
	if low == 0 || u == t {
		return low
	}
	fenliu := 0
	liu := 0
	for i := head[u]; i != -1; i = e[i].next {
		v := e[i].u
		if dep[v] == dep[u]+1 {
			fenliu = dfs(v, t, Min(low, e[i].rong-e[i].liu))
			if fenliu > 0 {
				//fmt.Print("dfs:", u, " ", v, " ", fenliu, "\n")
				liu += fenliu
				e[i].liu += fenliu
				e[i^1].liu -= fenliu
				low -= fenliu
				if low == 0 {
					break
				}
			}

		}
	}
	return liu
}

func Maxflow() {
	Init()
	var n int
	var m int
	var s int = 0
	var t int
	var E int
	fmt.Scan(&n, &m, &E)
	// fmt.Printf("%d %d", n, m)
	t = n + m + 1
	for i := 1; i <= E; i++ {
		u := 1
		v := 1
		fmt.Scan(&u, &v)
		v += n
		//fmt.Printf("%d %d", u, v)
		adde(u, v, 1)
	}
	for i := 1; i <= n; i++ {
		adde(s, i, 1)
	}
	for i := 1; i <= m; i++ {
		adde(i+n, t, 1)
	}

	ans := 0
	for bfs(s, t) {
		ans += dfs(s, t, inf)
	}
	// for i := 0; i <= n+m+1; i++ {
	// 	for j := head[i]; j != -1; j = e[j].next {
	// 		fmt.Print(i, " ", e[j].u, " ", e[j].rong, " ", e[j].liu, "\n")
	// 	}
	// }
	fmt.Printf("%d\n", ans)
}

/*

6
3
1 4
2 5
3 6
*/