Subversion Repositories wimsdev

Rev

Rev 4158 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
20 reyssat 1
!if $wims_read_parm!=slib_header
2
 !goto proc
3
!endif
4
slib_title=Shortest path of a graph
5
slib_parms=3\
6
, A matrix of size n by n\
7
, s first vertex\
8
, t second vertex
9
slib_author=Bernadette PERRIN-RIOU
10
slib_out=list of vertices in a minimal path from s to t  
11
slib_comment=
12
slib_example= [1,0,1,0;0,1,1,0;0,2,4,1;0,1,1,1],1,3
13
 
14
!exit
15
 
16
:proc
17
 
18
!distribute item $wims_read_parm into slib_GM,slib_s,slib_t
19
slib_GM= !declosing $slib_GM
20
slib_GM=!replace internal ; by $\
21
$ in $slib_GM
22
slib_n = !linecnt $slib_GM
23
slib_bp=100
24
slib_S=$slib_s
25
 
26
slib_precedent=!values $slib_s for x = 1 to $slib_n
27
 
28
!for slib_j=1 to $slib_n
29
   slib_L=!line $slib_s of $slib_GM
30
   !if $slib_j != $slib_s
31
     slib_u=!item $slib_j of $slib_L
32
     !if $slib_u=0
33
        slib_pi = $slib_pi,\infty
34
     !else
35
        slib_pi = $slib_pi,$slib_u
36
     !endif
37
   !else
38
     slib_pi = $slib_pi,0
39
   !endif
40
!next slib_j
41
 slib_cor = ($slib_S), ($slib_pi)
42
 slib_pi = !nonempty items $slib_pi
43
 
44
!for slib_i = 1 to $slib_n
45
  !if $slib_i != $slib_s 
46
# 1. On trouve un sommet satisfaisant
47
    !distribute items $[($slib_bp+1)*$slib_n],0,0 into slib_x,slib_y,slib_z
48
    !for slib_j = 1 to $slib_n
49
       slib_u = !item $slib_j of $slib_pi
50
       !if $slib_u notsametext \infty
51
         !if ($slib_j notitemof $slib_S) and ($slib_u < $slib_x)
52
           slib_x = $slib_u
53
           slib_y = $slib_j
54
         !endif
55
       !else
56
         !if ($slib_j notitemof $slib_S) and ($slib_z=0)
57
           slib_z = $slib_j
58
         !endif
59
       !endif
60
    !next slib_j
61
    !if $slib_y != 0
62
        slib_sommet = $slib_y
63
    !else
64
        slib_sommet = $slib_z
65
    !endif
66
 
67
    slib_S = $slib_S,$slib_sommet
68
# 2. On modifie le vecteur pi
69
   !for slib_j = 1 to $slib_n
70
    !if $slib_j != $slib_s
71
     slib_u = !item $slib_j of $slib_pi
72
     slib_v = !item $slib_sommet of $slib_pi
73
     slib_L = !line $slib_sommet of $slib_GM
74
     slib_w = !item $slib_j of $slib_L
75
     slib_y = 0
76
     !if $slib_v notsametext \infty
77
        !if $slib_u notsametext \infty
78
          slib_x = $[min($slib_u,$[$slib_v+$slib_w])]
79
          !if ($slib_w != 0) and ($slib_j notitemof $slib_S)
80
            slib_y = 1
81
            !if $slib_x = $[$slib_v+$slib_w] 
82
              slib_precedent =  !replace item number $slib_j by $slib_sommet in $slib_precedent
83
            !endif
84
          !endif       
85
        !else
86
          slib_x = $[$slib_v+$slib_w]
87
          !if ($slib_w != 0) and ($slib_j notitemof $slib_S)
88
            slib_y = 1
89
            slib_precedent =  !replace item number $slib_j by $slib_sommet in $slib_precedent
90
          !endif
91
        !endif
92
        !if $slib_y=1
93
          slib_pi = !replace item number $slib_j by $slib_x in $slib_pi
94
        !endif
95
     !endif
96
     !endif s
97
   !next slib_j
98
   slib_cor = $slib_cor, ($slib_S), ($slib_pi)
99
 !endif s
100
!next slib_i
101
 
102
path from s to t
103
 slib_liste = $slib_t
104
 slib_pit =  !item $slib_t of $slib_pi
105
!if $slib_pit notsametext \infty
106
  slib_prec = $slib_t
107
  !for slib_k = 1 to $slib_pit
108
    slib_prec = !item $slib_prec of $slib_precedent
109
    slib_liste =  $slib_prec,$slib_liste
110
  !next slib_k
111
!endif
112
 
113
slib_out=$slib_liste
114
 
115