Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910func CF653D(_r io.Reader, out io.Writer) {11 in := bufio.NewReader(_r)12 binarySearchF := func(l, r float64, f func(x float64) bool) float64 {13 14 for step := 63; step > 0; step-- {15 m := (l + r) / 216 if f(m) {17 r = m18 } else {19 l = m20 }21 }22 return (l + r) / 223 }24 min := func(a, b int) int {25 if a < b {26 return a27 }28 return b29 }30 31 var n, m, b, v, w, cap, st int32 Fscan(in, &n, &m, &b)33 end := n - 134 type nb struct{ to, rid, cap, c int }35 g := make([][]nb, n)36 addEdge := func(from, to, cap int) {37 g[from] = append(g[from], nb{to, len(g[to]), cap, 0})38 g[to] = append(g[to], nb{from, len(g[from]) - 1, 0, 0})39 }40 for ; m > 0; m-- {41 Fscan(in, &v, &w, &cap)42 v--43 w--44 addEdge(v, w, cap)45 }46 47 d := make([]int, n)48 bfs := func() bool {49 for i := range d {50 d[i] = -151 }52 d[st] = 053 q := []int{st}54 for len(q) > 0 {55 v := q[0]56 q = q[1:]57 for _, e := range g[v] {58 if w := e.to; e.c > 0 && d[w] < 0 {59 d[w] = d[v] + 160 q = append(q, w)61 }62 }63 }64 return d[end] >= 065 }66 var iter []int67 var dfs func(int, int) int68 dfs = func(v int, minF int) int {69 if v == end {70 return minF71 }72 for ; iter[v] < len(g[v]); iter[v]++ {73 e := &g[v][iter[v]]74 if w := e.to; e.c > 0 && d[w] > d[v] {75 if f := dfs(w, min(minF, e.c)); f > 0 {76 e.c -= f77 g[w][e.rid].c += f78 return f79 }80 }81 }82 return 083 }84 85 ans := binarySearchF(0, 1e6, func(x float64) bool {86 for _, es := range g {87 for j := range es {88 c := int64(float64(es[j].cap) / x) 89 if c > int64(b) {90 c = int64(b)91 }92 es[j].c = int(c)93 }94 }95 maxFlow := 096 for bfs() {97 iter = make([]int, n)98 for {99 if f := dfs(st, 1e9); f > 0 {100 maxFlow += f101 } else {102 break103 }104 }105 }106 return maxFlow < b107 })108 Fprintf(out, "%.10f", ans*float64(b))109}110 111112