File: busack.f

package info (click to toggle)
scilab 4.0-12
  • links: PTS
  • area: non-free
  • in suites: etch, etch-m68k
  • size: 100,640 kB
  • ctags: 57,333
  • sloc: ansic: 377,889; fortran: 242,862; xml: 179,819; tcl: 42,062; sh: 10,593; ml: 9,441; makefile: 4,377; cpp: 1,354; java: 621; csh: 260; yacc: 247; perl: 130; lex: 126; asm: 72; lisp: 30
file content (137 lines) | stat: -rw-r--r-- 3,208 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
      subroutine busack(c,ex,gamma,is,it,la2,lp2,ma,
     &     markb,mm,n,or,p,phimim,piv,v,valflo,flag)
      implicit integer (a-z)
      dimension lp2(*),la2(mm),or(ma),ex(ma)
      dimension c(ma)
      doubleprecision gamma(ma),markb(n),piv(n)
      dimension phimim(ma)
      dimension p(n)
      doubleprecision infr,zero,eps,x,y,z,errtol,absz
      if (is .lt. 0 .or. is .gt. n .or. it .lt. 0 .or. it .gt. n) then
         call erro('bad internal node number')
         return
      endif
      flag=1
      coderr=0
      valflo=0
      errtol=1.0d-6
      do 3 u=1,ma
         if (c(u).ge.0)goto 3
         coderr=2
         goto 999
    3 continue
      do 5 u=1,ma
         if(gamma(u).ge.0)goto 5
         coderr=3
         goto 999
    5 continue
      zero=0.00001
      infr=10.d6
      infe=32700
      do 10 u=1,ma
         phimim(u)=0
 10   continue
      do 20 i=1,n
         piv(i)=0
 20   continue
 100  continue
      do 110 i=1,n
         markb(i)=infr
         p(i)=-infe
 110  continue
      markb(is)=0
      p(is)=0
      i=is
 120  continue
      if(lp2(i).eq.lp2(i+1))goto 155
      do 150 ll = lp2(i),lp2(i+1)-1
         u=la2(ll)
         if(i.eq.or(u)) goto 130
         if(i.eq.ex(u)) goto 140
 130     j=ex(u)
         if(phimim(u).eq.c(u)) goto 150
         if(p(j).ge.0) goto 150
         x=markb(j)
         y=markb(i) + gamma(u) + piv(i) - piv(j)
         if(x.le.y) goto 150
         markb(j)=y
         p(j)= -u
         goto 150
 140     j=or(u)    
         if(phimim(u).eq.0) goto 150
         if(p(j).ge.0)goto 150
         x=markb(j)
         z= gamma(u) - piv(i) + piv(j)
         absz=abs(z-zero)
         if(absz.gt.errtol)goto 145
         coderr = 2
         goto 999
 145     continue
         y=markb(i) - z
         if(x.le.y) goto 150
         markb(j)=y
         p(j)= -u
 150  continue
 155  continue
      p(i) = -p(i)
      i=0
      x=infr
      do 160 j=1,n
         if(p(j).ge.0) goto 160
         if(markb(j).ge.x) goto 160
         i=j
         x=markb(j)
 160  continue
      if(i.gt.0) goto 120
      if(markb(it).lt.infr) goto 200
      coderr=1
      goto 999
 200  continue
      eps = infr
      i=it
 210  continue
      if(i.eq.is) goto 220
      u=p(i)
      if(i.eq.or(u)) goto 215
      eps=min(eps,dble(c(u)-phimim(u)))
      i=or(u)
      goto 210
 215  continue
      eps=min(eps,dble(phimim(u)))
      i=ex(u)
      goto 210
 220  continue
      eps=min(eps,dble(v-valflo))
      i=it
 230  continue
      if(i.eq.is) goto 240
      u=p(i)
      if(i.eq.or(u))goto 235
      phimim(u)=phimim(u) + eps
      i=or(u)
      goto 230
 235  continue
      phimim(u)=phimim(u) - eps
      i=ex(u)
      goto 230
 240  continue
      do 250 i=1,n
         piv(i)=piv(i)+markb(i)
 250  continue
      valflo=valflo + eps
      if(valflo.lt.v)goto 100
 999  continue
      if (coderr .eq. 0) then
         return
      else if (coderr .eq. 1) then
         call out('constrained flow too big')
         flag=0
         return
      else if (coderr .eq. 2) then
         call erro('negative maximum capacities')
         return
      else if (coderr .eq. 3) then
         call erro('negative costs')
         return
      endif
      end