← Home
For problem statement at 0-999/900-999/920-929/925/problemF.txt this is a correct solution, but verifier at 0-999/900-999/920-929/925/verifierF.go ends with wrong answer on test 1
input:
 3 2
1 3 2 1 2 2
2 3 0 0 1 2

expected:
 0.000000

got:
 0.0000000000


exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
)

type Edge struct {
	to, rev int
	cap, flow float64
}

type EdgeInfo struct {
	u, v       int
	a, b, c, d float64
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, m int
	if _, err := fmt.Fscan(reader, &n, &m); err != nil {
		return
	}

	edges := make([]EdgeInfo, m)
	for i := 0; i < m; i++ {
		fmt.Fscan(reader, &edges[i].u, &edges[i].v, &edges[i].a, &edges[i].b, &edges[i].c, &edges[i].d)
	}

	graph := make([][]Edge, n+2)
	for i := range graph {
		graph[i] = make([]Edge, 0, 10)
	}

	addEdge := func(u, v int, cap float64) {
		if u == v {
			return
		}
		graph[u] = append(graph[u], Edge{to: v, rev: len(graph[v]), cap: cap, flow: 0})
		graph[v] = append(graph[v], Edge{to: u, rev: len(graph[u]) - 1, cap: 0, flow: 0})
	}

	level := make([]int, n+2)
	ptr := make([]int, n+2)
	q := make([]int, 0, n+2)

	dinic := func(S, T int) float64 {
		var maxFlow float64
		for {
			for i := range level {
				level[i] = -1
			}
			level[S] = 0
			q = q[:0]
			q = append(q, S)
			head := 0
			for head < len(q) {
				u := q[head]
				head++
				for _, e := range graph[u] {
					if level[e.to] == -1 && e.cap-e.flow > 1e-9 {
						level[e.to] = level[u] + 1
						q = append(q, e.to)
					}
				}
			}
			if level[T] == -1 {
				break
			}

			for i := range ptr {
				ptr[i] = 0
			}

			var dfs func(u int, pushed float64) float64
			dfs = func(u int, pushed float64) float64 {
				if pushed < 1e-9 {
					return 0
				}
				if u == T {
					return pushed
				}
				for ; ptr[u] < len(graph[u]); ptr[u]++ {
					e := &graph[u][ptr[u]]
					tr := e.to
					if level[u]+1 != level[tr] || e.cap-e.flow < 1e-9 {
						continue
					}
					push := pushed
					if e.cap-e.flow < push {
						push = e.cap - e.flow
					}
					p := dfs(tr, push)
					if p < 1e-9 {
						continue
					}
					e.flow += p
					graph[tr][e.rev].flow -= p
					return p
				}
				return 0
			}

			for {
				pushed := dfs(S, 1e15)
				if pushed < 1e-9 {
					break
				}
				maxFlow += pushed
			}
		}
		return maxFlow
	}

	evaluate := func(t float64) float64 {
		for i := range graph {
			graph[i] = graph[i][:0]
		}

		D := make([]float64, n+2)
		for _, e := range edges {
			l := e.a*t + e.b
			r := e.c*t + e.d
			addEdge(e.u, e.v, r-l)
			D[e.v] += l
			D[e.u] -= l
		}

		var sumD float64
		for v := 1; v <= n; v++ {
			if D[v] > 0 {
				addEdge(0, v, D[v])
				sumD += D[v]
			} else if D[v] < 0 {
				addEdge(v, n+1, -D[v])
			}
		}

		return dinic(0, n+1) - sumD
	}

	L := 0.0
	R := 1.0
	for i := 0; i < 100; i++ {
		m1 := L + (R-L)/3.0
		m2 := R - (R-L)/3.0
		if evaluate(m1) < evaluate(m2) {
			L = m1
		} else {
			R = m2
		}
	}

	t_max := L
	max_g := evaluate(t_max)

	if max_g < -1e-7 {
		fmt.Printf("%.10f\n", 0.0)
		return
	}

	L_bin := 0.0
	R_bin := t_max
	for i := 0; i < 80; i++ {
		mid := L_bin + (R_bin-L_bin)/2.0
		if evaluate(mid) >= -1e-7 {
			R_bin = mid
		} else {
			L_bin = mid
		}
	}
	t_left := R_bin

	L_bin2 := t_max
	R_bin2 := 1.0
	for i := 0; i < 80; i++ {
		mid := L_bin2 + (R_bin2-L_bin2)/2.0
		if evaluate(mid) >= -1e-7 {
			L_bin2 = mid
		} else {
			R_bin2 = mid
		}
	}
	t_right := L_bin2

	fmt.Printf("%.10f\n", t_right-t_left)
}