Professional Documents
Culture Documents
Dkirienko Cbook
Dkirienko Cbook
-2013, C.python
1.1
. . . . . . . . . . . . . . . . . . . . . . . .
1.2
. . . . . . . . . . . . . . . . . . . . . . .
1.3
. . . . . . . . . . . . . . . . . . . . . . .
1.4
. . . . . . . . . . . . . . . . . . . . . . .
2.1
. . . . . . . . . . . . . . . . . . . . . . . .
3.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
3.3
12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
4.1
. . . . . . . . . . . . . . . . . . . . . . . . . . .
13
4.2
. . . . . . . . . . . . . . . . . . . . . . . . . . .
15
4.3
. . . . . . . . . . . .
17
4.4
. . . . . . . . . . . . . . . . . . . . .
18
4.5
Python
19
. . . . . . . . . . . . . . . . . . . . .
19
5.1
5.2
. . . . . . . . .
19
. . . . . . . . . .
23
5.2.1
. . . . . . . . . . . . . . . . .
23
5.2.2
. . . . . . . . . . . . .
25
5.2.3
. . . . . . . . . . . . . . . .
5.3
. . . . . . . . . . .
5.4
5.5
26
27
. . . . . .
29
. . . . . . . . . . . . . . . . . . . .
31
5.5.1
. . . . . . . . . . . . . . . . . . . . .
31
5.5.2
. . . . . . . . . . . . . . . . . .
32
5.5.3
. . . . . . . . .
34
35
6.1
. . . . . . . . . . . . . . . . . . . . .
35
6.2
k-
. . . . . . . . . . . .
37
6.3
. . . . . . . . . . . . . . . . . . . . .
38
8
9
39
7.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
7.2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
46
50
9.1
. . . . . . . . . . . . . . .
50
9.1.1
53
. . . . . . . . . . .
10
55
10.1 . . . . . . . . . . . . . . . . .
55
10.2
57
. . . . . . . . . . . .
10.3 . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
10.4 . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
10.5 . . . . . . . . . . . . . . . . . . . . . . . . .
66
10.6 -
. . . . . . . . . . . . . . . . . . . .
69
10.7 . . . . . . . . . . . . . . . . . . . . . . . . . .
71
1.1
().
A, (, , , . .). ,
A[i] A[i + 1] .
[4, 1, 2, 4, 2, 3],
[1, 2, 2, 3, 4, 4]. -
( ).
(-
). .
. . 0 ( ).
1. ,
, c 2 . .
, .
i 0.
A[: i]) ,
A[i :]
i.
def S e l e c t i o n S o r t (A ) :
f o r i in r a n g e ( 0 ,
l e n (A)
A[ i : ]
1):
min_idx =
for
min_idx
in r a n g e ( i + 1 , l e n (A ) ) :
i f A [ j ] < A [ min_idx ] :
min_idx = j
A[ i ] ,
A [ min_idx ]
A[ min_idx ]
= A [ min_idx ] ,
A[ i ]
A[ i ]
,
A[j]
A[i],
A[i :]
def S e l e c t i o n S o r t (A ) :
f o r i in r a n g e ( 0 , l e n (A) 1 ) :
f o r j in r a n g e ( i + 1 , l e n (A ) ) :
i f A[ j ] < A[ i ] :
A[ i ] ,
A[ j ]
= A[ j ] ,
A[ i ]
, -
n . n .
n 1 , n 1 -
. n 2 . .
= O(n2 ). ,
n + (n 1) + (n 2) + ... + 1 = n(n+1)
2
,
.
1.2
:
,
i-
A[: i]
. -
. -
A[i] . ,
i = 5 A[: i] = [1, 4, 6, 8, 8], A[i] = 5.
A[i] = 5 A[1] = 4, ,
5 1. c A[: i+1] = [1, 4, 5, 6, 8, 8]. , A[i] A[: i] ,
, , A[i]
A[i].
, ..
A[i],
A[i]
def I n s e r t i o n S o r t (A ) :
f o r i in r a n g e ( 1 ,
#
#
#
new_elem
l e n (A ) ) :
new_elem = A [ i ]
j =
A[ i
A[ i ]
1]
new_elem
A[i 1].
A[ j + 1 ] = A[ j ]
A [ j + 1 ] = new_elem
new_elem
. , ,
. , ..
O(n). ,
, ,
.
, , , , , . . . -
n(n+1)
= O(n2 ).
2
, , -
1+2+. . .+(n1)+n =
, .
, .
, ?
( ,
),
n(n+1)
= O(n2 ).
4
.
1.3
.
, ,
. ,
,
, . , .
.
. .
, .
. . ,
. :
def B u b b l e S o r t (A ) :
f o r j in r a n g e ( l e n (A) 1 , 0 ,
f o r i in r a n g e ( 0 , j ) :
i f A[ i ] > A[ i + 1 ] :
A[ i ] ,
A[ i
1):
+ 1 ] = A[ i
+ 1] ,
A[ i ]
O(n2 ).
,
? ,
O(n2 )
, , .
,
IsNotOrdered, True, .
IsNotOrdered = False ( -
, ), -
IsNotOrdered = True.
IsNotOrdered
,
,
True.
def B u b b l e S o r t (A ) :
j = l e n (A)
I s N o t O r d e r e d = True
while I s N o t O r d e r e d :
IsNotOrdered = False
for
in r a n g e ( 0 , j ) :
i f A[ i ] > A[ i + 1 ] :
A[ i ] ,
A[ i
+ 1 ] = A[ i
+ 1] ,
A[ i ]
I s N o t O r d e r e d = True
j
(
). , . , , .
, , ,
, .
1.4
, , , , . ,
, , ,
, oat. , .
K . 0, 1, 2, . . . , K 1
,
,
A. Count K (
0 K - 1), Count[i] i
A. elem 1 A[elem]. .
0 , Count[0],
1 Count[1] . .
. K ,
, 1.
def C o u n t S o r t (A ) :
K = max (A) + 1
Count =
[0]
f o r e l e m in A :
Count [ e l e m ] += 1
Result =
for
val
[]
in r a n g e (K ) :
R e s u l t += [ v a l ]
Count [ v a l ]
return R e s u l t
, , , ,
.
,
. , :
,
O(n + K).
n, -
, ,
100,
106
-
2.1
, , .
. , , ( ) .
( , ), . (
) .
, ,
i j, .
.
A[i:] + B[j:] ( , ).
[]
= 0
j = 0
i += 1
else :
Res . append (B [ j ] )
j += 1
Res += A [ i : ]
+ B[ j : ]
return Res
, merge A B,
O(1).
.
, , , . 1 0, .
1, (
, ). ,
merge.
def M e r g e S o r t (A ) :
i f l e n (A) <= 1 :
return A
else :
L = A [ : l e n (A)
R = A [ l e n (A)
//
//
2]
2:]
return merge ( M e r g e S o r t ( L ) , M e r g e S o r t (R ) )
.
.
O(n)
n/2,
n/4
O(n)
. ,
O(n)
n/8
n/4
. ,
n 2, , 1,
log2 n. , O(n log2 n).
,
( , ) .
3.1
(.
stack
) ,
,
.
, ,
, .
LIFO (last in, rst out -
, ).
:
push .
pop . , . , pop
.
top (
).
size .
top ( pop push), size
isempty . clear,
.
Python
,
append
append. .
Stack, .
def p u s h ( S t a c k ,
data ) :
S t a c k . append ( d a t a )
def pop ( S t a c k ) :
return S t a c k . pop ( )
def t o p ( S t a c k ) :
return S t a c k [ 1 ]
def
s i z e ( Stack ) :
return l e n ( S t a c k )
def i s e m p t y ( S t a c k ) :
return l e n ( S t a c k ) == 0
def
c l e a r ( Stack ) :
Stack [ : ]
[]
, , :
Stack =
[]
push ( Stack ,
1)
push ( Stack ,
2)
push ( Stack ,
3)
while s i z e ( S t a c k ) > 0 :
print ( pop ( S t a c k ) )
, () , ,
, ,
stacksize. stacksize 1, 1.
, , :
def p u s h ( d a t a ) :
stacksize
stacksize
Stack [ s t a c k s i z e ]
+ 1
= data
def pop ( ) :
data = Stack [ s t a c k s i z e ]
stacksize
stacksize
return d a t a
Python ,
, . ,
O(1).
-
Stack,
push, pop, top .. __elems,
.
push, pop ..
class Stack :
def __init__ ( s e l f ) :
s e l f . __elems =
def p u s h ( s e l f ,
[]
data ) :
s e l f . __elems . append ( d a t a )
def pop ( s e l f ) :
return s e l f . __elems . pop ( )
def t o p ( s e l f ) :
return s e l f . __elems [ 1 ]
def
size ( self ):
return l e n ( s e l f . __elems )
def i s e m p t y ( s e l f ) :
return l e n ( s e l f . __elems ) == 0
def
clear ( self ):
s e l f . __elems [ : ]
[]
-:
S = Stack ( )
S . push ( 1 )
S . push ( 2 )
S . push ( 3 )
while S . s i z e ( ) > 0 :
print ( S . pop ( ) )
. -,
. , , , ,
, .
3.2
(.
queue
) , -
, .
,
, .
FIFO (rst in, rst out
, ). , ,
,
pop top
.
, ,
, ,
pop
0. :
c l a s s Queue :
def __init__ ( s e l f ) :
s e l f . __elems =
def p u s h ( s e l f ,
[]
data ) :
s e l f . __elems . append ( d a t a )
def pop ( s e l f ) :
return s e l f . __elems . pop ( 0 )
def t o p ( s e l f ) :
return s e l f . __elems [ 0 ]
, .
,
, , (
O(n),
).
pop
, , ,
. ( )
__queuestart
, .
1, , -
, .
c l a s s Queue :
def __init__ ( s e l f ) :
s e l f . __elems =
[]
10
s e l f . __queuestart = 0
def p u s h ( s e l f ,
data ) :
s e l f . __elems . append ( d a t a )
def t o p ( s e l f ) :
return s e l f . __elems [ s e l f . _ _ q u e u e s t a r t ]
def pop ( s e l f ) :
s e l f . _ _ q u e u e s t a r t += 1
return
s e l f . __elems [ s e l f . _ _ q u e u e s t a r t
1]
size
c l a s s Queue :
def s i z e ( s e l f ) :
return l e n ( s e l f . __elems )
s e l f . __queuestart
, .
,
, .
.
, ,
. ,
, .
. (
).
, .
, .
,
,
.
.
, ,
, ,
O(1).
,
, .
, .
pop:
c l a s s Queue :
def pop ( s e l f ) :
result
s e l f . __elems [ s e l f . _ _ q u e u e s t a r t ]
s e l f . _ _ q u e u e s t a r t += 1
11
if
s e l f . __queuestart >
l e n ( s e l f . __elems )
s e l f . __elems [ : s e l f . _ _ q u e u e s t a r t ]
2:
[]
s e l f . __queuestart = 0
return r e s u l t
.
O(1),
O(n).
(.
deque
, (
3.3
O(n),
O(1).
double-ended queue ) -
,
.
.
,
O(n).
,
. :
append(x) x ( ).
appendleft(x) x ( ).
pop() ( ) . .
popleft() ( ) . .
clear() .
rotate(n)
,
.
n-
n < 0,
|n|
deque
len, ,
D deque, D[0]
() , D[1] , .. D[-1]
() , D[-2]
.. :
import c o l l e c t i o n s
D =
c o l l e c t i o n s . deque ( )
D. a p p e n d l e f t ( 1 )
D. a p p e n d l e f t ( 2 )
D. a p p e n d r i g h t ( 3 )
#
#
[2 , 1 , 3]
12
D. p o p l e f t ( )
,
O(1),
O(n).
4.1
. , ,
A key. True
False. , key.
, , for
key :
def s e a r c h (A, k e y ) :
f o r i in r a n g e ( l e n (A ) ) :
i f A [ i ] == k e y :
return True
return F a l s e
Python (for
elem in A), c (for i in range(len(A)).
:
def s e a r c h (A, k e y ) :
f o r e l e m in A :
i f e l e m == k e y :
return True
return F a l s e
while
. , ,
key
. i
, i=0. i , i ,
,
key.
i < len(A).
def s e a r c h (A,
i
key ) :
= 0
13
key, -
, ,
key, ,
1.
for:
def s e a r c h (A, k e y ) :
f o r i in r a n g e ( l e n (A ) ) :
i f A [ i ] == k e y :
return i
return 1
while:
def s e a r c h (A,
i
key ) :
= 0
if
i <
l e n (A ) :
return i
else :
return
(
)
,
,
O(n) (n ).
key -
,
:
def s e a r c h (A,
i
key ) :
= 0
while A [ i ] != k e y :
i += 1
return i
key , key ,
( key
,
) .
.
.
. ,
, .
def s e a r c h (A,
key ) :
A . append ( l e y )
i
= 0
while A [ i ] != k e y :
i += 1
A . pop ( )
14
4.2
,
, .
,
,
. ,
, , , ,
O(log2 n)
( ,
).
, ,
key
. ,
key. , left
right. , A[right] ,
key, ,
right. A[left] ,
, key. ,
A[left] A[right] ( ,
left, right), . left right ,
.
,
, , ,
, .
, -
, 0,
= -1 right = len(A). , ,
(. . , , key), -1, , , len(A).
, left right
.
left right . middle = (left + right) // 2.
key. A[middle]
key , A[middle] ,
, . ,
right = middle. ( A[middle] <= key),
A[middle] , , ,
left = middle. ,
left right , right >
left + 1.
.
left
r i g h t = l e n (A)
while r i g h t > l e f t + 1 :
15
middle = ( l e f t
+ right )
//
else :
left
= middle
? left right
, A[right] > key, A[left] <= key. , key , A[left] == key,
, A[left] < key. , left == -1 (
A key, right left
== -1 right == 0).
A key left >= 0 and A[left] == key.
, :
def B i n a r y S e a r c h (A,
left
key ) :
r i g h t = l e n (A)
while r i g h t > l e f t + 1 :
middle = ( l e f t
+ right )
//
else :
left
return
= middle
l e f t >= 0
and A [ l e f t ] == k e y
,
.
right ? , , key. , A[right]
key (
, key, ),
, right ,
key, .
, right key: key,
. , A key:
key ) :
r i g h t = l e n (A)
while r i g h t > l e f t + 1 :
middle = ( l e f t
+ right )
//
else :
left
= middle
return r i g h t
, ,
16
key, , ,
. :
key ) :
r i g h t = l e n (A)
while r i g h t > l e f t + 1 :
middle = ( l e f t
+ right )
//
i f A [ m i d d l e ] >= k e y :
r i g h t = middle
else :
left
= middle
return r i g h t
left right ? A[left] < key,
A[right] >= key. right ,
( ) key, , right , key. , key,
right, , , . , key. ,
UpperBound ,
key, LowerBound , key ( , , key),
UpperBound(A, key) - LowerBound(A, key)
key A.
LowerBound
key A right < len(A) and A[right] == key
(, ,
right , key,
, ,
key, LowerBound
left == len(A) - 1, right == len(A)).
4.3
,
,
[a, b],
. ,
,
.
EPS.
def r o o t ( a , b ) :
while b a > EPS :
17
x = ( right +
if
f (x) >
left )
0:
b = x
else
:
a = x
return ( a + b ) / 2
4.4
, , ,
,
, . .
, a , b . n ,
?
. , -
,
:
1. , ( ).
2.
, () (
).
3. () ,
.
4. (, ) , .
. ,
, ,
. ,
t // a + t // b >= n.
t,
, ,
:
t = 0
while t / / a + t // b < n :
t += 1
,
t,
t // a + t // b >=
n .
18
n,
right = t ( t , ),
left = t ( t , ). , right left
. , right == left + 1, right
,
n ,
right - 1 .
left -1 ( -1
), right ,
left
, ,
an.
1
right = a
while r i g h t > l e f t + 1 :
t = ( left
if
//
+ right )
a + t
//
//
b >= n :
right = t
else :
left
= t
print ( r i g h t )
, left 0,
n = 0
0,
0 0 , left t,
, left
-1.
4.5
Python
Python .
5
5.1
. , .
19
0. -
n.
n,
F (n).
F (0) = 1
F (n).
( ,
0 0 ),
F (1) = 1, F (2) = 2.
n1
F (n)? n
n 2
1.
n 1 n 2,
F (n) = F (n 2) + F (n 1),
n 2.
def F ( n ) :
if n < 2:
return 1
else :
return F ( n
1 ) + F( n
2)
n,
n = 40,
, .
, , , .
,
F (n 1)
F (n 2) F (n 1) F (n 2). F (n 3)
, F (n 4)
. .
,
.
,
, .
,
, .
F =
[0]
F[0]
F[1]
for
(n + 1)
= 1
= 1
i
in r a n g e ( 2 , n + 1 ) :
F[ i ]
= F[ i
2] + F[ i
1]
O(n).
20
F (i)
F (i + 1)
F (i + 2).
. ,
, .
,
,
, .
. ,
, -
n. : F (n) =
F (n 1) + F (n 2) + F (n 3). : F (0), F (1), F (2).
:
F =
[0]
(n + 1)
F[0]
= 1
F[1]
= F[0]
F[2]
for
= F[1]
i
+ F[0]
in r a n g e ( 3 , n + 1 ) :
F[ i ]
= F[ i
3] + F[ i
2] + F[ i
1]
. , . Map: Map[i] == 0,
i , Map[i] == 1,
. ,
n.
: Map[i] == 0, F[i] = 0, , 0,
, .
Map[i] == 1, F[i] , . :
F =
[0]
F[0]
for
(n + 1)
= 1
in r a n g e ( 1 , n + 1 ) :
i f Map [ i ] == 0 :
F[ i ]
= 0
else :
F[ i ]
= sum ( F [ max ( 0 ,
3):
i ])
F[i - 3] +
F[i - 2] + F[i - 1] , F[1] F[2]
, .
.
,
, . i
Price[i] Price.
0
21
n.
n. C(n). n n 1 n 2.
C(n 1) C(n 2) ,
Price[n] n. n1 n2 -
C(n)
- 0
, .
:
, :
C =
for
[0]
C[ 1 ]
(n + 1)
= Price [ 1 ]
in r a n g e ( 2 , n + 1 ) :
[ i ]
= min (C [ i
1] ,
C[ i
2])
+ Price [ i ]
n.
, ,
.
.
Prev[i], i, . Prev[i] ,
i (
, Prev ). Prev[i]?
i i -1,
Prev[i] = i - 1, Prev[i] = i - 2.
, Prev[i].
C =
[0]
C[ 1 ]
Prev [ 1 ]
for
(n + 1)
= Price [ 1 ]
i
= 0
in r a n g e ( 2 , n + 1 ) :
i f C[ i 1 ] < C[ i 2 ] :
C[ i ]
= C[ i
Prev [ i ]
i
1] + Price [ i ]
1
else :
C[ i ]
= C[ i
Prev [ i ]
i
2] + Price [ i ]
2
n ,
0.
Path.
Path =
i
[]
= n
while i > 0 :
Path . append ( i )
i
= Prev [ i ]
Path . append ( 0 )
Path = Path [ : :
1]
22
Path 0,
, Path (. . ,
).
Prev. , i, C[i-1]
C[i-2]. , ,
C[i-1] C[i-2]. ,
C .
Path =
i
[]
= n
while i > 0 :
i f C[ i 1 ] < C[ i 2 ] :
prev =
1
else :
prev =
Path . append ( p r e v )
i
= prev
Path . append ( 0 )
Path = Path [ : :
5.2
1]
, .
5.2.1
. ,
- .
, .
,
(i, j),
.
, , 0.
(0, 0).
F (i, j) (0, 0)
(i, j). (i, j)
(i, j 1), (i 1, j) (i 1, j 1).
, :
F (i, j) = F (i, j 1) + F (i 1, j) + F (i 1, j 1)
,
i=0
j = 0.
23
1
9
13
25
41
25
63
129
41
129
321
,
, ( ), .
,
m for i
in r a n g e ( n ) :
F =
[[0]
for
F[ i ] [ 0 ]
for
in r a n g e ( n ) ]
= 1
in r a n g e (m) :
F[0][ j ]
for
.
= 1
in r a n g e ( 1 , n ) :
f o r j in r a n g e ( 1 , m) :
i
F[ i ] [ j ]
= F[ i ] [ j
1] + F[ i
1][ j ]
+ F[ i
1][ j
. :
1. , ,
(, ).
2. (
, ). , ,
.
3. , ,
.
4. ( ) . , , ,
- . .
5. ,
2 .
, .
, .
24
1]
.
,
, 0,
(0, 0),
1:
13
25
41
25
63
129
41
129
321
:
F =
[[0]
F[0][0]
for
(m + 1 )
for
in r a n g e ( n + 1 ) ]
= 1
i in r a n g e ( 1 , n + 1 ) :
f o r j in r a n g e ( 1 , m + 1 ) :
F[ i ] [ j ]
5.2.2
= F[ i ] [ j
1] + F[ i
1][ j ]
+ F[ i
1][ j
, . , ,
(1, 1),
(n, m),
.
,
P rice[i, j],
(i, j)
(i, j)
(1, 1)
(i, j)
.
INF, INF , ,
,
0:
INF = 10
C =
[[0]
C[ 0 ] [ 0 ]
for
2 0
(m +
for
in r a n g e ( n + 1 ) ]
= 0
in r a n g e ( 1 , n + 1 ) :
C[ i ] [ 0 ]
for
1)
C[0][0] = 0.
= INF
in r a n g e ( 1 , m + 1 ) :
25
C.
1]
C[ 0 ] [ j ]
for
= INF
in r a n g e ( 1 , n + 1 ) :
f o r j in r a n g e ( 1 , m + 1 ) :
i
C[ i ] [ j ]
= min (C [ i ] [ j
C[ i
1] ,
1][ j
C[ i
1])
1][ j ] ,
+ Price [ i ] [ j ] )
. , ,
,
Answer =
i
.
[]
= n
j = m
while ( i ,
j)
!=
(0 ,
0):
Answer . append ( ( i ,
j ))
prev_C = min (C [ i ] [ j
i f C[ i ] [ j
i ,
1] ,
C[ i
1][ j ] ,
C[ i
1][ j
1])
1 ] == prev_C :
j = i ,
e l i f C[ i
i ,
1 ] [ j ] == prev_C :
j =
1,
j =
1,
1]
else :
i ,
Answer = Answer [ : :
5.2.3
.
nm
-. ,
,
, -. ,
, , ,
. ,
.
. + -. + , (
, , ,
), - , .
, , , +,
, :
+
+
+
+
+
+
+
+
+
-
, , , .
26
,
, +.
- ,
, , +, . , , .
+
+
+
+
+
+
+
, ,
- , +
, , , ,
, -.
. +,
, , -.
-, ,
+. .
5.3
( )
b0 ...bm1 .
a0 ...an1 ,
B.
(-
) ,
, ,
n , 2n
n -
.
:
, .
.
, .
, A='abcabaac', B='baccbca' A B
4, , 'acba' 'acbc'.
,
2n
, .
O(nm).
27
an1
bm1 .
,
.
A = a0 ...an1
B = b0 ...bm1
,
,
a0 ...an2
b0 ...bm2 .
()
(an1
bm1 )
, (an1
bm1 ) -
, .
-
b0 ...bm2 .
-
- , , .
.
i : A0 = a0 ...ai1
B j : B = b0 ...bj1 .
0
0
, A = A[: i] B = B[: j].
F (i, j) A0 B 0 .
A0
. ,
bj1 ,
F (i, j) = F (i 1, j 1) + 1
A0
B 0 . ai1 =
- ,
1 .
:
F (i 1, j) F (i, j 1), -
:
, ,
0:
F (0, j) = F (i, 0) = 0.
(n + 1) (m + 1)
.
( ),
:
n = l e n (A)
m = l e n (B)
F =
for
(m + 1 ) f o r i in r a n g e ( n + 1 ) ]
in r a n g e ( 1 , n + 1 ) :
f o r j in r a n g e ( 1 , m + 1 ) :
i f A [ i 1 ] == B [ j 1 ] :
[[0]
F[ i ] [ j ]
= F[ i
1][ j
1] + 1
else :
F[ i ] [ j ]
= max ( F [ i
28
1][ j ] ,
F[ i ] [ j
1])
print ( F [ n ] [ m] )
'abcabaac'
'baccbca'.
4.
F F [i][j] ,
.
.
ai1 = bj1 ,
F [i][j] F [i1][j 1] 1,
F [i 1][j 1], ai1 = bj1 .
F [i 1][j] F [i][j 1],
F [i][j]. :
.
Ans =
i
[]
= n
j = m
=
=
e l i f F[ i
i
1]:
1])
1
1
1 ] [ j ] == F [ i ] [ j ] :
else :
j
= 1
1]
Ans = Ans [ : :
5.4
a0 ...an1 .
.
.
, (
29
b0 , . . . , bm1 .
. , -
A,
O(n2 ).
F (i)
ai .
F (i)
aj ,
j<i
aj < ai .
aj
F (i),
. ,
F (i) = 1 +
min
j<i,aj <ai
aj ai
F (j).
j,
F (j)
j < i),
F (i) = 1.
F =
[0]
for
in r a n g e ( l e n (A ) ) :
f o r j in r a n g e ( i ) :
i f A [ j ] < A [ i ] and F [ j ] > F [ i ] :
l e n (A)
F[ i ]
= F[ j ]
F [ i ] += 1
( )
F (i).
ai , F (i) .
. .
aj ,
j<i
F (j) = F (i) 1.
j,
F (j) =,
.
,
O(n2 ).
,
:
F (i)
- -
,
i.
i i ,
.
:
+ inf ,
F (0) = inf ,
F (n + 1) =
n + 1
, ,
( ).
,
.
, .
:
i > 0,
, 1.
30
ai .
, ,
ai . k ,
x, F (k) = x,
x < ai , k +1
, ai ,
k . F (k + 1),
F (k + 1) , ai . , F k , F (k) < ai , F (k + 1) ai ,
F (k + 1) = ai .
,
LowerBound,
, ,
ai .
ai ,
F
, .
:
INF = 10
F =
[ INF ]
F[0]
for
=
i
10
( l e n (A) + 1 )
INF
in r a n g e ( l e n (A ) ) :
left
= 0
r i g h t = l e n (A)
while r i g h t
left
middle = ( l e f t
>
1:
+ right )
//
i f F [ m i d d l e ] >= A [ i ] :
r i g h t = middle
else :
left
F[ right ]
= middle
= A[ i ]
( )
i,
F (i) 6= + inf .
. , ,
i
i -
5.5
5.5.1
a1 , a2 , . . . , an . K
. ,
( - , ).
, ,
31
, . ,
a1 = 1, a2 = 20, a3 = 90,
K = 100.
90 10 1,
, 50.
.
F (k)
-
. , -
ai .
k ai , F (k ai ) . F (k) =
1 + F (k ai ). i: F (k) = 1 + mini F (k ai ).
: F (0) = 0, F (k) = +
k < 0. + -
, , .
k ,
k ai 0.
i,
F (k)
,
e A 0.
INF = 10
F =
[ INF ]
F[0]
= 0
10
(K + 1 )
f o r k in r a n g e ( 1 , K + 1 ) :
f o r i in r a n g e ( l e n (A ) ) :
i f k A [ i ] >= 0 and F [ k
F[ k ]
= F[ k
A[ i ] ]
< F[ k ] :
A[ i ] ]
F [ k ] += 1
,
k,
ai ,
F (k) = F (k ai ) + 1.
,
, Ans.
Ans =
[]
k = K
while k != 0 :
f o r i in r a n g e ( l e n (A ) ) :
i f k A [ i ] >= 0 and F [ k ] == F [ k
A[ i ] ]
+ 1:
Ans . append (A [ i ] )
k
5.5.2
A[ i ]
,
F (k) < +.
. , ( ),
32
.
:
a1 , a2 ,
...,
an .
n -
(
K ).
k,
F (k)
,
F (k).
ai F (k) = 1, F (kai ) =
1, k ,
k ai .
,
F =
[0]
F[0]
(K + 1 )
= 1
for
in r a n g e ( l e n (A ) ) :
F_new = F [ : ]
f o r k in r a n g e (A [ i ] , K + 1 ) :
i f F [ k A [ i ] ] == 1 :
F_new [ k ]
= 1
F = F_new
.
0,
F (0) = 1,
,
, .
ai ,
k k ai ,
ai .
F,
.. ,
ai .
.
F =
for
[0]
F[0]
(K + 1 )
= 1
i in r a n g e ( l e n (A ) ) :
f o r k in r a n g e (K, A [ i ] 1 ,
i f F [ k A [ i ] ] == 1 :
F[ k ]
1):
= 1
, ,
P rev .
F =
F[0]
[0]
P rev
(K + 1 )
= 1
Prev =
[0]
(K + 1 )
33
F (k) = 1:
for
i in r a n g e ( l e n (A ) ) :
f o r k in r a n g e (K, A [ i ] 1 ,
i f F [ k A [ i ] ] == 1 :
F[ k ]
1):
= 1
Prev [ k ]
= A[ i ]
Ans =
k P rev(k)
k = 0.
[]
k = K
while k > 0 :
Ans . append ( P r e v [ k ] )
k
5.5.3
Prev [ k ]
. ,
:
)
K.
2n
, .
O(2n ).
( ),
O(nK)
k ,
(0 1),
,
, .
:
F (i, k)
- -
k,
F (i, k)
F (i, k) = F (i 1, k),
i1
F (i, k) = F (i 1, k).
i
k wi ,
i 1 ,
F (i 1, k wi ).
i , pi .
F (i, k) = F (i 1, k wi ) + pi .
k wi ),
i.
i,
34
P.
( ),
1
F =
for
n.
[ 0 ] (K + 1 ) f o r i in r a n g e ( n + 1 ) ]
in r a n g e ( 1 , n + 1 ) :
f o r k in r a n g e ( 1 , K + 1 ) :
i f k >= W[ i ] :
[
F[ i ] [ k ]
= max ( F [ i
1][k] ,
F[ i
1][k
W[ i ] ]
else :
F[ i ] [ k ]
= F[ i
1][k]
1.
i ,
F (i, k). F (i, k) = F (i 1, k), i
i 1 k . i
, k wi .
.
k = K
for
in r a n g e ( n , 0 ,
i f F [ i ] [ k ] != F [ i
1):
1][k ]:
Ans . append ( i )
k
= W[
i ]
Ans ,
.
. ,
, , , . .
6.1
n a0 , a1 , . . . , an1 .
n-
2n . , 3
{1, 2, 3} : {} ( ), {1}, {2}, {3}, {1, 2},
{1, 3}, {2, 3}, {1, 2, 3}.
n , i-
0, ai ,
1, ai .
35
+ P[ i ] )
, , .
, (.
n.
n = 3 :
. 0 1)
,
000
001
010
011
100
101
110
111
, .. ,
0, , 1. , , ,
. .
n=3
. 0,
n1
, 1
n1
, - (, 0),
0 ( 00)
n2
, 1
( 01),
n2
generate . -
. prex,
. prex, 0, 1,
n 1 .
n = 0,
,
prex.
, - ,
print .
n1
prex 0,
1. :
def g e n e r a t e ( n , p r e f i x ) :
i f n == 0 :
print ( p r e f i x )
36
else :
generate (n
generate (n
1,
prefix
+ "0" )
1,
prefix
+ "1" )
, 5,
: generate(5, )
. ,
, 1 . , 1 , prex 0, .
:
def g e n e r a t e ( n , p r e f i x ) :
i f n == 0 :
print ( p r e f i x )
else :
generate (n
if
1,
p r e f i x == " "
generate (n
6.2
prefix
+ "0" )
or p r e f i x [ 1 ] == " 0 " :
1,
prefix
+ "1" )
k-
. (k -
n-
) .
generate,
k,
. prex 0,
(n1,
n1
k ), k , ..
. prex 1,
(n
1, k 1).
, , . , 1
,
,
k < n,
k > 0. 0 k = n
def g e n e r a t e ( n , k , p r e f i x ) :
i f n == 0 :
print ( p r e f i x )
else :
if k < n:
generate (n
1,
k,
1,
prefix
+ "0" )
if k > 0:
generate (n
1,
prefix
+ "1" )
.
n. k 1 n.
1
37
, ,
n=4
{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4}.
. ,
k=2
6 :
, -
n.
def g e n e r a t e ( n , k , p r e f i x ) :
i f k == 0 :
print ( p r e f i x )
else :
i f l e n ( p r e f i x ) == 0 :
next = 1
else :
next =
p r e f i x [ 1] + 1
while n e x t + k
generate (n ,
1 <= n :
1,
prefix
[ next ] )
n e x t += 1
prex , generate
.
,
n -
, prex.
k = 0, prex -
. ,
prex. next. next 1
prex, prex , next 1.
next 1, next
n k + 1,
prex. next
. . next
6.3
k1
, next,
n.
1
, 1
n,
. ,
n!,
,
.
,
(-
) prex .
1
n -
. prex,
prex
.
, prex
n,
prex.
38
def g e n e r a t e ( n , p r e f i x ) :
i f l e n ( p r e f i x ) == n :
print ( p r e f i x )
else :
f o r n e x t in r a n g e ( 1 , n + 1 ) :
i f n e x t not in p r e f i x :
generate (n ,
prefix
[ next ] )
n- ,
k - , , -
, . , : ,
, , .
7.1
n-
n
.
,
0
2 2 2 = 2n .
n1.
0 1, , i-
1, i- 0
.
0 1.
:
def g e n e r a t e ( n , p r e f i x ) :
i f n == 0 :
print ( p r e f i x )
else :
generate (n
generate (n
1,
prefix
+ "0" )
1,
prefix
+ "1" )
, , ,
0
2n 1.
2n 1.
bin, , bin
0b, bin
for
in r a n g e ( 2
n:
n):
39
S = bin ( i ) [ 2 : ]
S = "0"
(n
len (S)) + S
print ( S )
,
, :
010
0002
110
0012
210
0102
310
0112
410
1002
510
1012
610
1102
710
1112
,
bin (
),
, ,
.
int, 2
.
. ,
'101' '110', '100'. 1,
1.
, :
def N e x t B i n a r y S e q u e n c e ( S ) :
n = len (S)
i f S == ' 1 ' n :
return None
else :
S = bin ( i n t (S ,
return
'0 '
(n
2) +
1)[2:]
len (S)) + S
. , ,
None.
:
40
def P r e v B i n a r y S e q u e n c e ( S ) :
n = len (S)
i f S == ' 0 ' n :
return None
else :
S = bin ( i n t (S ,
return
'0 '
(n
2)
1)[2:]
len (S)) + S
.
:
1. ( )
, .
2. .
3. , , , .
-
0 1. ,
, 0. ,
. , 1,
, 0.
def N e x t B i n a r y S e q u e n c e ( S ) :
n = len (S)
i
= n
if
i <
0:
return None
else :
return S [ : i ] + " 1 " + " 0 "
(n
1)
: , 1,
0,
, 1.
def P r e v B i n a r y S e q u e n c e ( S ) :
n = len (S)
i
= n
if
i <
0:
return None
else :
return S [ : i ] + " 0 " + " 1 "
41
(n
1)
( )
: ,
:
S = "0"
while S :
print ( S )
S = NextBinarySequence ( S )
7.2
n. , n
n!: n ,
n 1 ..
def g e n e r a t e ( n , p r e f i x ) :
i f l e n ( p r e f i x ) == n :
print ( p r e f i x )
else :
f o r n e x t in r a n g e ( 1 , n + 1 ) :
i f n e x t not in p r e f i x :
generate (n ,
prefix
[ next ] )
. , ,
(n
= 9).
(2, 9, 6, 5, 8, 7, 4, 3, 1)
, ,
, .
5,
(8, 7, 4, 3, 1)
,
. ,
5 , .
5 7,
, 5, ,
5, , 7.
5 7 ,
(2, 9, 6, 7, 8, 5, 4, 3, 1).
, 7, , .
, 5 7 ,
, ,
.
NextPermutation. ,
42
def N e x t P e r m u t a t i o n (P ) :
i
= l e n (P)
if
i <
0:
P[:]
[]
return
j = l e n (P)
while P [ j ] < P [ i ] :
j
P[ i ] ,
P[ i
P[ j ]
= P[ j ] ,
P[ i ]
= P [ : i : 1]
1:]
P[i],
, P[i + 1]. while, i, P[i] <
P[i + 1] . ,
,
. .
P[j], P[i]. , P[i] , ,
, P[i] (, P[i + 1] > P[i]), , ,
P[i]. P[i] P[j] , P[i]
.
:
def P r e v P e r m u t a t i o n (P ) :
i
= l e n (P)
if
i <
0:
P[:]
[]
return
j = l e n (P)
while P [ j ] > P [ i ] :
j
P[ i ] ,
P[ i
P[ j ]
1:]
= P[ j ] ,
P[ i ]
= P [ : i : 1]
. 0
(n 1)!
n = 4:
43
n!
P0
(1, 2, 3, 4)
P1
(1, 2, 4, 3)
P2
(1, 3, 2, 4)
P3
(1, 3, 4, 2)
P4
(1, 4, 2, 3)
P5
(1, 4, 3, 2)
P6
(2, 1, 3, 4)
P7
(2, 1, 4, 3)
P8
(2, 3, 1, 4)
P9
(2, 3, 4, 1)
P10
(2, 4, 1, 3)
P11
(2, 4, 3, 1)
P12
(3, 1, 2, 4)
P13
(3, 1, 4, 2)
P14
(3, 2, 1, 4)
P15
(3, 2, 4, 1)
P16
(3, 4, 1, 2)
P17
P18
=
=
(3, 4, 2, 1)
(4, 1, 2, 3)
P19
(4, 1, 3, 2)
P20
(4, 2, 1, 3)
P21
(4, 2, 3, 1)
P22
(4, 3, 1, 2)
P23
(4, 3, 2, 1)
, 1, 2 ..
(n 1)!
, -
,
. , 1, 0 , 2, ..
, .
, ,
,
. , ,
(n 1)!.
.
.
44
, , 1
1
n.
n,
. , (6, 4, 1, 9). 4! = 24, 4
3! = 6 , ,
( 6 > 1 6 > 4).
2 6 = 12 , (4, 1, 9).
2! = 2 ( 4 > 1),
2 (1, 9).
,
(9),
.
, ,
12 + 2 = 14.
:
def NumberByPermutation ( S ) :
n = len (S)
i f n <= 1 :
return 0
k = 0
f o r e l e m in S :
i f elem < S [ 0 ] :
k += 1
return math . f a c t o r i a l ( n
1)
k + NumberBySequence ( S [ 1 : ] )
def NumberByPermutation ( S ) :
ans = 0
n = len (S)
for
in r a n g e ( n ) :
k = 0
f o r e l e m in S [ i + 1 : ] :
i f elem < S [ i ] :
k += 1
a n s += math . f a c t o r i a l ( n
i )
return a n s
.
(n 1)!,
(n 1)!
,
, .
, .
prefix ,
45
unused ) :
if
l e n ( u n u s e d ) == 0 :
return p r e f i x
n = l e n ( unused )
k = num / /
math . f a c t o r i a l ( n
1)
p r e f i x . append ( u n u s e d [ k ] )
u n u s e d . pop ( k )
num %= math . f a c t o r i a l ( n
SequenceByNumber ( num ,
1)
prefix ,
unused )
return p r e f i x
: num , prex
, ,
unused , . , 100-
n=5
:
SequenceByNumber ( 1 0 0 ,
[] ,
[1 ,
2,
3,
4,
5]):
[]
unused =
[ i
for
in r a n g e ( 1 , n + 1 ) ]
while n > 0 :
n
k = num / /
math . f a c t o r i a l ( n )
a n s . append ( u n u s e d [ k ] )
u n u s e d . pop ( k )
num %= math . f a c t o r i a l ( n )
return a n s
, :
1. .
2. ( - )
. .
.
,
O(n),
O(1).
, -
46
,
O(n),
O(1),
.
(. heap)
O(logn).
,
. , , , ,
( 4 ) . .
,
.
, ,
. ,
().
:
.
, .
9 .
, . ,
1.
2, 3, 4 .
. :
Heap [ 1 ]
== 1 0 0
Heap [ 2 ]
== 1 9
Heap [ 3 ]
== 3 6
Heap [ 4 ]
== 1 7
Heap [ 5 ]
== 3
Heap [ 6 ]
== 2 5
47
Heap [ 7 ]
== 1
Heap [ 8 ]
== 2
Heap [ 9 ]
== 7
, H[i]
H[2*i], - H[2*i+1]. H[i]
H[i//2].
Heap,
__data. size Heap ,
__data 1, __data . top () ,
__data[1].
c l a s s Heap ( ) :
__data =
def
[ None ]
size ( self ):
return l e n ( s e l f . __data )
def t o p ( s e l f ) :
return s e l f . __data [ 1 ]
.
, (
append ).
( ). , . .
, , ( )
.
, .
( ) :
c l a s s Heap ( ) :
def add ( s e l f , x ) :
H =
s e l f . __data
H . append ( x )
i
= l e n (H)
= H[ i
//
//
2]:
2]
//= 2
= x
add x. H ,
, .. self.__data. H ,
48
i . ,
. while,
i .
i, ,
i , x. i elem.
, , . -
. , .
, ,
, .
, .
, ,
. ,
( ,
.
c l a s s Heap :
def pop ( s e l f ) :
H =
if
s e l f . __data
s e l f . s i z e ( ) == 1 :
return H . pop ( )
result
H[ 1 ]
i
= H[ 1 ]
= H . pop ( )
= 1
while ( 2
+ 1 <
i f H[ 2
i ] > H[ 2
j = 2
and
l e n (H)
i :2
1]:
2]))):
else :
j = 2
H[ i ] ,
i
if
H[ j ]
+ 1
= H[ j ] ,
H[ i ]
= j
i == l e n (H)
H[ i ] ,
H[ 2
i ]
and H [ i ] < H[ 2
= H[ 2
i ] ,
i ]:
H[ i ]
return r e s u l t
result,
. , , . . .
.
.
.
49
, ( )
,
.
( )
,
- .
O(h)
h.
h
1 + 2 + 4 + ... + 2h1 = 2h 1.
2h1 n < 2h , , h
n, O(log n).
-
(. heapsort). ,
- , -
. . , ,
( -
) (
).
. - .
, ( ),
. , .
. -
. , . ,
.
9.1
, .
- .
- . - . ,
ASCII- Unicode , , ,
50
, ,
h('b') = 2,
...,
h('z') = 26.
h('a') = 1,
-, 0
- .
2
-, :
1. - 1 2 .
2. - , .
3. .
a0 a1 -
h(a0 a1 ) = h(a0 )b + h(a1 ).
, -
(, ,
b = 27),
2 -
.
- :
.. ,
- . ,
n1
a0 , a1 ,
...,
an1 ,
x = b.
( ),
( -
,
-
M . M
2, , ,
b.
232
264 .
, - :
h(a0 a1 a2 . . . an1 ) = (h(a0 )bn1 + h(a1 )bn2 + ... + h(an2 )b + h(an1 )) mod M
- ,
:
51
h(a0 a1 a2 . . . an1 ) =
= (h(a0 )bn2 + h(a1 )bn3 + ... + h(an2 ))b + h(an1 ) mod M =
= (h(a0 a1 a2 . . . an2 )b + h(an1 )) mod M
-
a0 a1 a2 . . . an1
a0 a1 a2 . . . an2 , b, an1 M . ,
, :
b = 27
M = 10
17 + 3
def Hash ( S ) :
result
= 0
f o r c h a r in S :
result
r e s u l t += o r d ( c h a r )
r e s u l t %= M
return r e s u l t
S T
m , , - S
m
m , b ,
- T .
T,
- .
, -
h(S).
h(ST )
T:
h(S[i : j]) = h(S[: j]) h(S[: i])bji mod M
-
S , - O(1), bm mod M .
52
Power [ j
i ])
mod M
:
i j S. S ,
. Prex -
S, Prex[i] c S[i] S. Power
M,
= bi mod M .
Power[i]
n+1
-
S), - S,
CalcPower,
n.
b = 27
M = 10
17 + 3
def C a l c P r e f i x ( S ) :
n = len (S)
Prefix =
for
[0]
(n + 1)
in r a n g e ( n ) :
Prefix [ i
+ 1] = ( Prefix [ i ]
b + h(S [ i ] ) )
% M
return P r e f i x
def C a l c P o w e r ( n ) :
Power =
for
[1]
(n + 1)
in r a n g e ( n ) :
Power [ i
+ 1 ] = Power [ i ]
b % M
return Power
def h ( c h a r ) :
return o r d ( c h a r )
S
:
Prefix = CalcPrefix (S)
Power = C a l c P o w e r ( l e n ( S ) )
O(n),
Hash
O(1)
- , , , .
9.1.1
m.
S = s0 s1 . . . sn1
T = t0 t1 . . . tm1
, S,
T. ,
.
53
k.
, ,
, .
-
, -
S (set), .
, -
set. -
- S,
True.
IsCommonSubstring.
:
k , -
Prex1 Prex2 -
( , - -
), Power
-.
def I s C o m m o n S u b s t r i n g ( k ,
Prefix1 ,
Prefix2 ,
Power ) :
S = set ()
for
in r a n g e ( k ,
S . add ( Hash ( i
for
in r a n g e ( k ,
len ( Prefix1 ) ) :
k,
i ,
Prefix1 ,
Power ) )
len ( Prefix2 ) ) :
i f Hash ( i k , i ,
return True
return F a l s e
Prefix2 ,
Power )
in S :
: -
k , k 1,
k ,
. -
b:
l e n (T ) ) )
left = 0, ,
0.
right = min(len(S), len(T)) + 1,
,
. left right :
left,
right. right
left + 1,
left.
54
left
= 0
r i g h t = min ( l e n ( S ) ,
l e n (T ) ) + 1
while r i g h t > l e f t + 1 :
middle = ( l e f t
if
+ right )
//
IsCommonSubstring ( middle ,
left
Prefix1 ,
Prefix2 ,
Power ) :
= middle
else :
r i g h t = middle
print ( l e f t )
10
10.1
, , ( ) . , ( . .)
, .
.
.
. -
. .
, . , ,
, , ,
.
u A B , ,
u A B, u. , , .
,
( ). ,
. ,
. .
( ,
, ).
,
.
n(n 1)/2.
n 1,
, .
:
.
,
.
55
, ,
u1 , u2 , . . . , uk , -
. , .
, .
,
. .
,
. ,
(), .
. ,
.
,
?
,
n1 - ,
n1
. ,
( ). .
:
.
, ,
.
.
:
n1
n,
-
1.
.
, :
1. , .
2. ,
n1
.
3. , .
4. ,
.
, ,
. .
56
10.2
(
, ),
:
1.
2. ,
u.
.
, ,
.
:
( ),
A[i][j] 1, i j 0
. :
1
, .
A[i][j],
, ( ,
).
O(n2 )
.
i
W[i] . :
W[ 1 ]
= [2 ,
3,
4]
W[ 2 ]
= [1 ,
4,
5]
W[ 3 ]
= [1 ,
4]
57
W[ 4 ]
= [1 ,
2,
W[ 5 ]
= [2 ,
4]
3,
5]
, :
W =
[[] ,
[2 ,
3,
4] ,
[1 ,
4,
5] ,
[1 ,
4] ,
[1 ,
2,
3,
5] ,
[2 ,
4]]
0, W[0].
, i (
W[i]), i j , j
W[i]. , -
O(1).
. A[i][j] 1, , i
j. i
j , W[i] j.
, :
:
1
:
W[ 1 ]
W[ 2 ]
= [4 ,
[2]
5]
W[ 3 ]
= [1 ,
4]
W[ 4 ]
= [1 ,
3]
W[ 5 ]
[]
. , :
, - -
. ,
:
58
5
1
2
5
4
1
1
3
7
2
5
4
2
4
3
4
.
(n + 1) (n + 1),
n , m = map ( i n t ,
A =
[[0]
for
i
u,
input ( ) . s p l i t ( ) )
for
(n + 1)
in r a n g e ( n + 1 ) ]
in r a n g e (m) :
v = map ( i n t ,
A[ u ] [ v ]
input ( ) . s p l i t ( ) )
= 1
# A[ v ] [ u ] = 1
, :
n , m = map ( i n t ,
W =
for
i
u,
for
input ( ) . s p l i t ( ) )
in r a n g e ( n + 1 ) ]
in r a n g e (m) :
[ set ()
v = map ( i n t ,
input ( ) . s p l i t ( ) )
W[ u ] . add ( v )
# W[ v ] . add(u)
. , u v
v u.
,
. .
.
, A[i][j] i
j. ,
, None.
,
.
, ,
, . :
n , m = map ( i n t ,
W =
[ dict ()
for
input ( ) . s p l i t ( ) )
i
in r a n g e ( n + 1 ) ]
59
for
in r a n g e (m) :
u,
v,
w e i g h t = map ( i n t ,
W[ u ] [ w ]
input ( ) . s p l i t ( ) )
= weight
u v if v in W[u], W[u][v].
10.3
d.
d,
- ,
d + 1.
d[i] i.
s, d[s] = 0.
s 1, , ,
1, 2 ( 0 1) ..
, .
d , None.
None, , 0. ,
0,
1. , 1,
, , 2 (
None). , 2 , 3 ..
,
n1
),
n 1.
, , , . .
,
. , ,
. ,
.
,
.
, , ,
, .
,
60
d,
d + 1,
d,
d + 1.
.
D =
[ None ]
D[ s t a r t ]
Q =
(n + 1)
= 0
[ start ]
Qstart = 0
while Q s t a r t < l e n (Q ) :
u = Q[ Q s t a r t ]
Q s t a r t += 1
f o r v in V [ u ] :
i f D [ v ] i s None :
D[ v ]
= D[ u ]
+ 1
Q . append ( v )
n c ,
1 n. ( )
start. Q , , Qstart .
append ,
Qstart 1 (
Q[Qstart]).
start, D[start] = 0 ( ).
, Qstart < len(Q). u.
v. v ,
D[v] is None, v
u, 1, v
.
O(n + m),
. ,
O(n2 ),
n .
. ,
, , .
. - , ,
.
:
Prev =
[ None ]
(n + 1)
61
Prev[i] i
start. i Prev[i],
Prev[i] i.
v ,
u, v u:
Prev [ v ]
= u
[]
finish
while c u r r
i s not None :
Ans . append ( c u r r )
c u r r = Prev [ c u r r ]
Ans start
nish, .
10.4
62
4. , .
,
,
. :
A B, B
A .
, ,
(,
, ). ,
:
1. - , .
2.
3. .
4. 1-3 .
,
, . Visited,
Visited[i] == True , Visited[i] == False
.
.
,
.
DFS(start),
start , .
Visited =
Prev =
[ False ]
[ None ]
(n + 1)
(n + 1)
def DFS( s t a r t ) :
Visited [ start ]
= True
f o r u in V [ s t a r t ] :
i f not V i s i t e d [ u ] :
Prev [ u ]
start
DFS( u )
n , 1 n, V[u] u.
, , start
DFS(start). , start, Visited, Prev
start .
, Start,
DFS .
63
. ,
.
, . - , ,
DFS .
Visited =
[ False ]
(n + 1)
def DFS( s t a r t ) :
Visited [ start ]
= True
f o r v in V [ s t a r t ] :
i f not V i s i t e d [ v ] :
DFS( v )
NComp = 0
for
in r a n g e ( 1 , n + 1 ) :
i f not V i s i t e d ( i ) :
NComp += 1
DFS( i )
DFS . , ,
. , ,
.
DFS , ( ).
Visited Color, 0 , 1 2 - .
DFS . , ,
. ,
, - ,
, , ( IsBipartite False,
, ).
Color =
[0]
IsBipartite
(n + 1)
= True
def DFS( s t a r t ) :
global I s B i p a r t i t e
f o r u in V [ s t a r t ] :
i f C o l o r [ u ] == 0 :
Color [ u ]
= 3
Color [ s t a r t ]
DFS( u )
else
if
C o l o r [ u ] == C o l o r [ s t a r t ] :
IsBipartite
for
= False
in r a n g e ( 1 , n + 1 ) :
64
if
C o l o r [ i ] == 0 :
Color [ i ]
= 1
DFS( i )
1 DFS
.
DFS - .
, , , DFS ,
. DFS
. 0 () . 1 () ,
2 () . 1 2 - .
, DFS ,
1.
Color =
[0]
(n + 1)
CycleFound = F a l s e
def DFS( s t a r t ) :
Color [ s t a r t ]
= 1
f o r u in V [ s t a r t ] :
i f C o l o r [ u ] == 0 :
DFS( u )
else
if
C o l o r [ s t a r t ] == 1 :
C y c l e F o u n d = True
Color [ s t a r t ]
for
if
= 2
in r a n g e ( 1 , n + 1 ) :
C o l o r [ i ] == 0 :
DFS( i )
, - . .
,
.
DFS, .
.
Visited =
Ans =
[ False ]
(n + 1)
[]
def DFS( s t a r t ) :
Visited [ start ]
= True
f o r u in V [ s t a r t ] :
i f not V i s i t e d [ u ] :
DFS( u )
65
Ans . append ( s t a r t )
for
in r a n g e ( 1 , n + 1 ) :
i f not V i s i t e d ( i ) :
DFS( i )
Ans = Ans [ : :
10.5
1]
109
. start i
D[i]. D[start]=0, D[i]=INF i.
start start 0,
.
D, .
.
i j W[i][j], D[i] + W[i][j] < D[j]. i i j,
,
j. D[j], D[j] = D[i] + W[i][j].
, ,
.
. i, , D[i] , D[i]
i. , D[i] i
start i,
( i).
.
i D[i]. , i, , -
66
, i.
,
INF ( ).
. N , 0 N-1. start
W.
INF = 10
D =
[ INF ]
D[ s t a r t ]
10
N
= 0
Colored =
[ False ]
while True :
m i n _ d i s t = INF
for
in r a n g e (N ) :
i f not C o l o r e d [ i ] and D [ i ] < m i n _ d i s t :
min_dist = D[ i ]
min_vertex =
if
m i n _ d i s t == INF :
break
i
= min_vertex
Colored [ i ]
for
= True
in r a n g e (N ) :
i f D [ i ] + W[ i ] [ j ] < D [ j ] :
D[ j ]
= D[ i ]
+ W[ i ] [ j ]
print (D)
Colored ,
. D Colored. ,
,
min_vertex, min_dist.
min_dist INF, .
,
.
O(n2 ),
, ,
, ,
. , .
i j, start
j i i-j. i j
j.
, . ,
i W[i]. , ,
67
Weight, .
i j Weight[i, j] .
D =
[ INF ]
D[ s t a r t ]
Prev =
= 0
[ None ]
Colored =
[ False ]
while True :
m i n _ d i s t = INF
for
in r a n g e (N ) :
i f not C o l o r e d [ i ] and D [ i ] < m i n _ d i s t :
min_dist = D[ i ]
min_vertex =
if
m i n _ d i s t == INF :
break
i
= min_vertex
Colored [ i ]
for
= True
in W[ i ] :
i f D [ i ] + Weight [ i ,
D[ j ]
= D[ i ]
Prev [ j ]
j ] < D[ j ] :
+ Weight [ i ,
j ]
start j :
Path
=[]
while j
i s not None :
Path . append ( j )
j = Prev [ j ]
Path = Path [ : :
1]
, . ,
. , .
,
. , , .
O(log n),
O(log n),
,
, .
68
10.6
- , , . ,
, ,
. , .
- . :
F[k][i] i,
k .
k=0. F[0][start]
= 0, i F[0][i] = INF, ,
start start,
,
INF.
F
k, , 1 ,
, 2 .. ,
n 1 (n - ),
F[n-1][i],
start i).
, F[k][i].
start i, k .
j-i. j k-1
, , F[k-1][j], i
F[k-1][j] + W[j][i], W[j][i] j-i. j, ,
F[k-1][j] + W[j][i].
:
INF = 10
F =
[ [ INF ]
F[ 0 ] [ start ]
10
for
in r a n g e (N ) ]
= 0
f o r k in r a n g e ( 1 , N ) :
f o r i in r a n g e (N ) :
F[ k ] [ i ]
for
= F[ k
1][ i ]
in r a n g e (N ) :
i f F[ k
1][ j ]
F[ k ] [ i ]
+ W[ j ] [ i ] < F [ k ] [ i ] :
= F[ k
1][ j ]
+ W[ j ] [ i ]
O(n3 ).
. , F
F[k][i] k, F[i] i,
. :
INF = 10
10
69
F =
[ INF ]
F[ start ]
= 0
f o r k in r a n g e ( 1 , N ) :
f o r i in r a n g e (N ) :
f o r j in r a n g e (N ) :
i f F [ j ] + W[ j ] [ i ] < F [ i ] :
F[ i ]
= F[ j ]
+ W[ j ] [ i ]
, j-i,
. j
i j-i .
,
, ,
, .
, j-i
W[j, i], j, i, .
.
, W - :
INF = 10
F =
[ INF ]
F[ start ]
10
N
= 0
f o r k in r a n g e ( 1 , N ) :
f o r j , i in W. k e y s ( ) :
i f F [ j ] + W[ j , i ] < F [ i ] :
F[ i ]
= F[ j ]
+ W[ j ,
i ]
- :
1. F F[start] = 0, F[i] = INF
i.
2. j-i , j-i.
3. 2 n-1 .
O(nm),
mm n2 )
- ,
. , (
, (
m n)
, .
,
:
INF = 10
F =
[ INF ]
Prev =
10
N
[ None ]
F[ start ]
= 0
f o r k in r a n g e ( 1 , N ) :
f o r j , i in W. k e y s ( ) :
i f F [ j ] + W[ j , i ] < F [ i ] :
70
F[ i ]
= F[ j ]
Prev [ i ]
+ W[ j ,
i ]
= Prev [ j ]
.
- ,
:
INF = 10
F =
[ INF ]
F[ start ]
10
N
= 0
Stop = F a l s e
k = 1
f o r j , i in W. k e y s ( ) :
i f F [ j ] + W[ j , i ] < F [ i ] :
F[ i ]
= F[ j ]
+ W[ j ,
i ]
Stop = F a l s e
- , ,
. .
, , .
CycleFound = F a l s e
f o r j , i in W. k e y s ( ) :
i f F [ j ] + W[ j , i ] < F [ i ] :
C y c l e F o u n d = True
break
10.7
( -, FloydWarshall) ,
, .
.
,
n 1.
ij
0
wij .
wij = +,
ij
wii = 0.
j,
akij
( ).
a0ij
i j , 0
, ij , aij = wij .
1
aij = wij , 2
0, aij
71
0 1 ..
anij
anij
j.
0
1
2
n
aij , aij , aij , . . . , aij , 0
k . - aij = wij .
k1
k
, aij
aij . i j , , , k ,
k 1. k 1,
k1
aij . k 1,
: i (k 1) (k 1) j .
, k 1,
k1
k1
ai,k1 + ak1,j .
, :
k1
k1
akij = min(ak1
ij , ai,k1 + ak1,j )
. , ,
A =
for
k , i, j :
f o r j in r a n g e ( n ) ]
in r a n g e ( n ) :
f o r j in r a n g e ( n ) :
[ [ [ INF
for
in r a n g e ( n ) ]
f o r k in r a n g e ( n + 1 ) ]
A[ 0 ] [ i ] [ j ]
= W[ i ] [ j ]
f o r k in r a n g e ( 1 , n + 1 ) :
f o r i in r a n g e ( n ) :
f o r j in r a n g e ( n ) :
A[ k ] [ i ] [ j ]
= min (A [ k
A[ k
1][
1]
1][ i ][ k
i ][ j ] ,
+ A[ k
1][k
1][ j ])
j,
. , A:
A[i][j], -
A[i][j]. k,
k-1 k.
[ [W[ i ] [ j ] f o r j in r a n g e ( n ) ]
f o r k in r a n g e ( n ) :
f o r i in r a n g e ( n ) :
f o r j in r a n g e ( n ) :
A =
A[ i ] [ j ]
for
= min (A [ i ] [ j ] ,
in r a n g e ( n ) ]
A[ i ] [ k ]
+ A[ k ] [ j ] )
O(n3 ).
, A[i][j] . ,
A[i][j] INF,
. A[i][j] INF
(, INF
),
72
, A[i][k] A[k][j]
INF, , INF,
.
,
i j
, .
:
i , A[i][i]
.
. , Prev[i][j] ,
i.
A[i][j] .
,
k,
ij
k,
Prev[i][j]=Prev[k][j].
j i j, :
for
i in r a n g e ( n ) :
f o r j in r a n g e ( n ) :
i f W[ i ] [ j ] < INF :
Prev [ i ] [ j ]
, , :
A =
for
[ [W[ i ] [ j ]
Prev =
[[( i
if
j
!=
in r a n g e ( n ) ] f o r
j e l s e None ) f o r
i
j
in r a n g e ( n ) ]
in r a n g e ( n ) ]
for
f o r k in r a n g e ( n ) :
f o r i in r a n g e ( n ) :
f o r j in r a n g e ( n ) :
i f (A [ i ] [ k ] < INF and A [ k ] [ j ] < INF and
A[ i ] [ k ]
A[ i ] [ j ]
Prev [ i ] [ j ]
+ A[ k ] [ j ] < A[ i ] [ j ] ) :
= A[ i ] [ k ]
ij
+ A[ k ] [ j ]
= Prev [ k ] [ j ]
, Path:
Path
=[]
while j
i s not None :
Path . append ( j )
j = Prev [ i ] [ j ]
Path = Path [ : :
1]
73
in r a n g e ( n ) ]