Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "log"
- "testing"
- )
- type Person struct {
- Name string
- From []*Record
- To []*Record
- }
- type Record struct {
- Amount int
- From *Person
- To *Person
- }
- // For all people connected to person B:
- // A -> B : 3, B -> C: 5 => A -> C : 3, B -> C: 2
- // After that no loop could pass through person B
- func (p *Person) relax() {
- di := 0
- ci := 0
- for di < len(p.From) && ci < len(p.To) { // 2N
- if p.From[di].Amount == p.To[di].Amount {
- p.From[di].Amount = 0
- p.To[di].Amount = 0
- ci++
- di++
- //TODO: remove edge where amount == 0
- } else if p.From[di].Amount > p.To[di].Amount {
- toDeduce := p.To[di].Amount
- p.From[di].Amount -= toDeduce
- p.To[di].Amount -= toDeduce
- ci++
- //TODO: remove edge where amount == 0
- } else {
- toDeduce := p.From[di].Amount
- p.To[di].Amount -= toDeduce
- p.From[di].Amount -= toDeduce
- di++
- //TODO: remove edge where amount == 0
- }
- }
- }
- func printState(people []Person) {
- for _, p := range people {
- for _, c := range p.To {
- log.Printf("%v %v-> %v", p.Name, c.Amount, c.To.Name)
- }
- }
- }
- func TestRelax(t *testing.T) {
- // initialization
- people := []Person{
- {Name: "A"}, {Name: "B"}, {Name: "C"}, {Name: "D"},
- }
- value := 1
- for i := range people {
- for j := range people {
- if i == j {
- continue
- }
- value++
- rec := Record{
- From: &people[i],
- To: &people[j],
- Amount: value,
- }
- people[i].To = append(people[i].To, &rec)
- people[j].From = append(people[j].From, &rec)
- }
- }
- log.Print("BEFORE")
- printState(people)
- for i := 0; i < len(people)/2; i++ {
- for _, p := range people {
- p.relax()
- }
- }
- log.Print("AFTER")
- printState(people)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement