Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910func CF1455E(_r io.Reader, _w io.Writer) {11 in := bufio.NewReader(_r)12 out := bufio.NewWriter(_w)13 defer out.Flush()14 const inf int64 = 1e1815 perm4 := [][]int{16 {0, 1, 2, 3}, {0, 1, 3, 2}, {0, 2, 1, 3}, {0, 2, 3, 1}, {0, 3, 1, 2}, {0, 3, 2, 1},17 {1, 0, 2, 3}, {1, 0, 3, 2}, {1, 2, 0, 3}, {1, 2, 3, 0}, {1, 3, 0, 2}, {1, 3, 2, 0},18 {2, 0, 1, 3}, {2, 0, 3, 1}, {2, 1, 0, 3}, {2, 1, 3, 0}, {2, 3, 0, 1}, {2, 3, 1, 0},19 {3, 0, 1, 2}, {3, 0, 2, 1}, {3, 1, 0, 2}, {3, 1, 2, 0}, {3, 2, 0, 1}, {3, 2, 1, 0},20 }21 22 var T int23 var x, y [4]int24 for Fscan(in, &T); T > 0; T-- {25 for i := 0; i < 4; i++ {26 Fscan(in, &x[i], &y[i])27 }28 ans := inf29 for _, p := range perm4 {30 type neighbor struct {31 to, rid int32 cap, cost int6433 }34 g := [8][]neighbor{}35 addEdge := func(from, to int, cap, cost int64) {36 g[from] = append(g[from], neighbor{to, len(g[to]), cap, cost})37 g[to] = append(g[to], neighbor{from, len(g[from]) - 1, 0, -cost})38 }39 for i := 0; i < 4; i++ {40 for j := 4; j < 6; j++ {41 addEdge(i, j, inf, 1)42 addEdge(j, i, inf, 1)43 }44 }45 st, end := 6, 746 for i, w := range []int{47 x[p[2]] - x[p[0]],48 x[p[1]] - x[p[3]],49 y[p[0]] - y[p[1]],50 y[p[3]] - y[p[2]],51 x[p[0]] + y[p[2]] - x[p[1]] - y[p[0]],52 x[p[3]] + y[p[1]] - x[p[2]] - y[p[3]],53 } {54 if w > 0 {55 addEdge(st, i, int64(w), 0)56 } else {57 addEdge(i, end, int64(-w), 0)58 }59 }60 61 dist := [8]int64{}62 type pair struct{ v, i int }63 fa := [8]pair{}64 spfa := func() bool {65 for i := 0; i < 8; i++ {66 dist[i] = inf67 }68 dist[st] = 069 inQ := [8]bool{}70 inQ[st] = true71 q := []int{st}72 for len(q) > 0 {73 v := q[0]74 q = q[1:]75 inQ[v] = false76 for i, e := range g[v] {77 if e.cap == 0 {78 continue79 }80 w := e.to81 if newD := dist[v] + e.cost; newD < dist[w] {82 dist[w] = newD83 fa[w] = pair{v, i}84 if !inQ[w] {85 q = append(q, w)86 inQ[w] = true87 }88 }89 }90 }91 return dist[end] < inf92 }93 var maxFlow, minCost int6494 for spfa() {95 minF := inf96 for v := end; v != st; {97 p := fa[v]98 if c := g[p.v][p.i].cap; c < minF {99 minF = c100 }101 v = p.v102 }103 for v := end; v != st; {104 p := fa[v]105 e := &g[p.v][p.i]106 e.cap -= minF107 g[v][e.rid].cap += minF108 v = p.v109 }110 maxFlow += minF111 minCost += dist[end] * minF112 }113 if minCost < ans {114 ans = minCost115 }116 }117 Fprintln(out, ans)118 }119}120 121122