Use this to learn the idea, then write your own version.
1package main2 3import (4 . "fmt"5 "io"6 "math"7)8 910func cf78E(in io.Reader, out io.Writer) {11 var n, t int12 Fscan(in, &n, &t)13 a := make([]string, n)14 for i := range a {15 Fscan(in, &a[i])16 }17 18 st := n * n * 219 end := st + 120 type nb struct{ to, rid, cap int }21 g := make([][]nb, end+1)22 addEdge := func(from, to, cap int) {23 g[from] = append(g[from], nb{to, len(g[to]), cap})24 g[to] = append(g[to], nb{from, len(g[from]) - 1, 0})25 }26 27 type pair struct{ x, y int }28 dir4 := []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}29 bfs0 := func(sx, sy int) [][]int {30 dis := make([][]int, n)31 for i := range dis {32 dis[i] = make([]int, n)33 for j := range dis[i] {34 dis[i][j] = 1e935 }36 }37 dis[sx][sy] = 038 q := []pair{{sx, sy}}39 for step := 1; len(q) > 0; step++ {40 tmp := q41 q = nil42 for _, p := range tmp {43 for _, d := range dir4 {44 x, y := p.x+d.x, p.y+d.y45 if 0 <= x && x < n && 0 <= y && y < n && a[x][y] <= '9' {46 if dis[x][y] == 1e9 {47 dis[x][y] = step48 q = append(q, pair{x, y})49 }50 }51 }52 }53 }54 return dis55 }56 57 var disZ [][]int58 ds := make([][][][]int, n)59 for i, r := range a {60 ds[i] = make([][][]int, n)61 for j, c := range r {62 if c == 'Z' {63 disZ = bfs0(i, j)64 } else if '0' < c && c <= '9' {65 addEdge(st, i*n+j, int(c-'0'))66 ds[i][j] = bfs0(i, j)67 }68 }69 }70 71 for i := range n {72 var s string73 Fscan(in, &s)74 for j, c := range s {75 if !('0' < c && c <= '9') {76 continue77 }78 capsule := n*n + i*n + j79 addEdge(capsule, end, int(c-'0'))80 for i0, r := range ds {81 o:82 for j0, d := range r {83 if d == nil || d[i][j] > t || d[i][j] > disZ[i][j] {84 continue85 }86 if i0 == i && j0 == j { 87 addEdge(i0*n+j0, capsule, 9)88 continue89 }90 for _, dir := range dir4 {91 x, y := i+dir.x, j+dir.y92 if 0 <= x && x < n && 0 <= y && y < n && a[x][y] <= '9' && d[x][y] < disZ[x][y] {93 addEdge(i0*n+j0, capsule, 9)94 continue o95 }96 }97 }98 }99 }100 }101 102 dis := make([]int, len(g))103 bfs := func() bool {104 clear(dis)105 dis[st] = 1106 q := []int{st}107 for len(q) > 0 {108 v := q[0]109 q = q[1:]110 for _, e := range g[v] {111 if w := e.to; e.cap > 0 && dis[w] == 0 {112 dis[w] = dis[v] + 1113 q = append(q, w)114 }115 }116 }117 return dis[end] > 0118 }119 iter := make([]int, len(g))120 var dfs func(int, int) int121 dfs = func(v, totalFlow int) (curFlow int) {122 if v == end {123 return totalFlow124 }125 for ; iter[v] < len(g[v]); iter[v]++ {126 e := &g[v][iter[v]]127 if w := e.to; e.cap > 0 && dis[w] > dis[v] {128 f := dfs(w, min(totalFlow-curFlow, e.cap))129 if f == 0 {130 continue131 }132 e.cap -= f133 g[w][e.rid].cap += f134 curFlow += f135 if curFlow == totalFlow {136 break137 }138 }139 }140 return141 }142 maxFlow := 0143 for bfs() {144 clear(iter)145 maxFlow += dfs(st, math.MaxInt)146 }147 Fprint(out, maxFlow)148}149 150151