Advertisement
Guest User

Untitled

a guest
Jul 17th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.74 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "log"
  5.     "testing"
  6. )
  7.  
  8. type Person struct {
  9.     Name string
  10.     From []*Record
  11.     To   []*Record
  12. }
  13.  
  14. type Record struct {
  15.     Amount int
  16.     From   *Person
  17.     To     *Person
  18. }
  19.  
  20. // For all people connected to person B:
  21. //  A -> B : 3,  B -> C: 5      =>  A -> C : 3,  B -> C: 2
  22. // After that no loop could pass through person B
  23. func (p *Person) relax() {
  24.     di := 0
  25.     ci := 0
  26.     for di < len(p.From) && ci < len(p.To) { // 2N
  27.         if p.From[di].Amount == p.To[di].Amount {
  28.             p.From[di].Amount = 0
  29.             p.To[di].Amount = 0
  30.             ci++
  31.             di++
  32.             //TODO: remove edge where amount == 0
  33.         } else if p.From[di].Amount > p.To[di].Amount {
  34.             toDeduce := p.To[di].Amount
  35.             p.From[di].Amount -= toDeduce
  36.             p.To[di].Amount -= toDeduce
  37.             ci++
  38.             //TODO: remove edge where amount == 0
  39.         } else {
  40.             toDeduce := p.From[di].Amount
  41.             p.To[di].Amount -= toDeduce
  42.             p.From[di].Amount -= toDeduce
  43.             di++
  44.             //TODO: remove edge where amount == 0
  45.         }
  46.     }
  47. }
  48.  
  49. func printState(people []Person) {
  50.     for _, p := range people {
  51.         for _, c := range p.To {
  52.             log.Printf("%v %v-> %v", p.Name, c.Amount, c.To.Name)
  53.         }
  54.     }
  55. }
  56.  
  57. func TestRelax(t *testing.T) {
  58.     // initialization
  59.  
  60.     people := []Person{
  61.         {Name: "A"}, {Name: "B"}, {Name: "C"}, {Name: "D"},
  62.     }
  63.  
  64.     value := 1
  65.     for i := range people {
  66.         for j := range people {
  67.             if i == j {
  68.                 continue
  69.             }
  70.             value++
  71.             rec := Record{
  72.                 From:   &people[i],
  73.                 To:     &people[j],
  74.                 Amount: value,
  75.             }
  76.             people[i].To = append(people[i].To, &rec)
  77.             people[j].From = append(people[j].From, &rec)
  78.         }
  79.     }
  80.     log.Print("BEFORE")
  81.     printState(people)
  82.     for i := 0; i < len(people)/2; i++ {
  83.         for _, p := range people {
  84.             p.relax()
  85.         }
  86.     }
  87.     log.Print("AFTER")
  88.     printState(people)
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement