Upload
krutarth-patel
View
42
Download
0
Embed Size (px)
DESCRIPTION
lol
Citation preview
5/24/2018 A Little Bit of Classics_ Dynamic Programming Over Subsets and Paths in Graphs - Codeforces
1/5
6/5/2014 A little bit of classics: dynamic programming over subsets and paths in graphs - Codeforces
http://codeforces.com/blog/entry/337 1/5
codestrophe| Logout
Sponsored by
You have Wow! You have +178!
Search by tag HOME CONTESTS GYM PROBLEMSET GROUPS RATING API HELP RCC
Ripatti's blog
A little bit of classics: dynamic programmingoversubsets and paths in graphs
Author thanks adamaxfor translation this article into English.
Introduction
After Codeforces Beta Round #11several participants expressed a wish to read something
about problems similar to problem Dof that round. The author of this article, for the purpose
of helping them, tried searching for such information, but to his surprise couldn't find
anything on the Internet. It is not known whether the search was not thorough or there'sreally nothing out there, but (just in case) the author decided to write his own article on this
topic.
In some sense this article may be regarded as a tutorial for the problem Dfrom Beta Round
#11.
In this article quite well-known algorithms are considered: the search for optimal
Hamiltonian walks and cycles, finding their number, check for existence and something
more. The so-called "dynamic programming over subsets" is used. This method requires
exponential time and memory and therefore can be used only if the graph is very small -
typically 20 vertices or less.
DP over subsets
Consider a set of elements numbered from 0 to N-1. Each subset of this setcan beencoded by a sequence of N bits (we will call this sequence "a mask"). The i-th element
belongs to the subset if and only if the i-th bit of the mask equals 1. For instance, the mask
00010011means that the subset of the set [0... 7]consists of elements 0, 1 and 4. There
are totally 2 masks, and so 2 subsets. Each mask is in fact an integer number written in
binary notation.
The method is to assign a value to each mask (and, therefore, to each subset) and
compute the values for new masks using already computed values. As a rule, to find the
value for a subsetAwe remove an element in every possible way and use values for
obtained subsetsA' ,A' ,... ,A' to compute the value forA. This means that the values
forA'must have been computed already, so we need to establish an ordering in which
masks will be considered. It's easy to see that the natural ordering will do: go over masks in
increasing order of corresponding numbers.
We will use the following notation:
bit(i,mask)- the i-th bit of maskcount(mask)- the number of non-zero bits in mask
first(mask)- the number of the lowest non-zero bit in mask
(a?b:c)- returns bif aholds, or c otherwise.
The elements of our set will be vertices of the graph. For the sake of simplicity we'll assumethat the graph is undirected. Modification of the algorithms for directed graphs is left as an
exercise for the reader.
1. Search for the shortest Hamiltonian walk
Let the graph G=(V,E)have nvertices, and each edge have a weight
Before contestCodeforces Round #252 (Div. 2)
3 days
Pay attention
41 people like this. Be the first of your
friends.
Like
codestrophe
Rating: 1489
Contribution: 0
SettingsBlogTeams
SubmissionsFavouritesTalksContests
codestrophe
# User Rating
1 tourist 3228
2 rng_58 2795
3 Petr 2787
4 scott_wu 2767
5 WJMZBMR 27336 0O0o00OO0Oo0o0Oo 2718
7 vepifanov 2712
8 SergeyRogulenko 2703
9 yeputons 2690
10 meret 2655
Countries | Cities | O rganiz ations View all
Top rated
# User Contrib.
1 DmitriyH 146
2 Fefer_Ivan 142
3 Petr 133
4 Sereja 131
5 MikhailRubinchik 129
5 elfus0 129
7 Egor 128
8 Zlobober 123
9 Nickolas 122
10 Xellos 120
10 dalex 120
View all
Top contributors
Handle:
Find user
By Ripatti, 4 years ago, translation, ,
N N
1 2 k
i
RIPATTI BLOG TEAMS SUBMISSIONS GROUPS ALKS CONTESTS
http://codeforces.com/profile/dalexhttp://codeforces.com/profile/Fefer_Ivanhttp://codeforces.com/profile/scott_wuhttp://codeforces.com/profile/touristhttp://codeforces.com/favourite/contestshttp://codeforces.com/blog/entry/337http://codeforces.com/blog/Ripattihttp://codeforces.com/http://vk.com/http://codeforces.com/http://codeforces.com/blog/entry/337?locale=enhttp://codeforces.com/blog/entry/337?locale=ruhttp://codeforces.com/contests/with/Ripattihttp://codeforces.com/usertalk/with/Ripattihttp://codeforces.com/groups/with/Ripattihttp://codeforces.com/submissions/Ripattihttp://codeforces.com/teams/with/Ripattihttp://codeforces.com/blog/Ripattihttp://codeforces.com/profile/Ripattihttp://codeforces.com/profile/Ripattihttp://codeforces.com/top-contributedhttp://codeforces.com/profile/dalexhttp://codeforces.com/profile/Xelloshttp://codeforces.com/profile/Nickolashttp://codeforces.com/profile/Zloboberhttp://codeforces.com/profile/Egorhttp://codeforces.com/profile/elfus0http://codeforces.com/profile/MikhailRubinchikhttp://codeforces.com/profile/Serejahttp://codeforces.com/profile/Petrhttp://codeforces.com/profile/Fefer_Ivanhttp://codeforces.com/profile/DmitriyHhttp://codeforces.com/ratingshttp://codeforces.com/ratings/organizationshttp://codeforces.com/ratings/citieshttp://codeforces.com/ratings/countrieshttp://codeforces.com/profile/merethttp://codeforces.com/profile/yeputonshttp://codeforces.com/profile/SergeyRogulenkohttp://codeforces.com/profile/vepifanovhttp://codeforces.com/profile/0O0o00OO0Oo0o0Oohttp://codeforces.com/profile/WJMZBMRhttp://codeforces.com/profile/scott_wuhttp://codeforces.com/profile/Petrhttp://codeforces.com/profile/rng_58http://codeforces.com/profile/touristhttp://codeforces.com/contests/with/codestrophehttp://codeforces.com/usertalkhttp://codeforces.com/favourite/contestshttp://codeforces.com/submissions/codestrophehttp://codeforces.com/teamshttp://codeforces.com/blog/codestrophehttp://codeforces.com/settings/generalhttp://codeforces.com/profile/codestrophehttp://codeforces.com/profile/codestrophehttp://codeforces.com/contests/441http://codeforces.ru/contest/11/problem/Dhttp://codeforces.ru/contest/11/problem/Dhttp://codeforces.ru/blog/entry/331http://codeforces.com/profile/adamaxhttp://codeforces.com/blog/entry/337http://codeforces.com/blog/Ripattihttp://codeforces.com/rcc2014http://codeforces.com/helphttp://codeforces.com/api/helphttp://codeforces.com/ratingshttp://codeforces.com/groupshttp://codeforces.com/problemsethttp://codeforces.com/gymshttp://codeforces.com/contestshttp://codeforces.com/http://codeforces.com/bestRatingChanges/400571http://vk.com/http://codeforces.com/0c4260048480d69ec1151bf4973a8910/logouthttp://codeforces.com/profile/codestrophehttp://codeforces.com/blog/entry/337?locale=ruhttp://codeforces.com/blog/entry/337?locale=enhttp://codeforces.com/5/24/2018 A Little Bit of Classics_ Dynamic Programming Over Subsets and Paths in Graphs - Codeforces
2/5
6/5/2014 A little bit of classics: dynamic programming over subsets and paths in graphs - Codeforces
http://codeforces.com/blog/entry/337 2/5
d(i,j). We want to find a Hamiltonian walk for which the sum of weights of its edges isminimal.
Let dp[mask][i]be the length of the shortest Hamiltonian walk in the subgraph generated
by vertices in mask, that ends in the vertex i.
The DP can be calculated by the following formulas:
dp[mask][i]=0, if count(mask)=1and bit(i,mask)=1, if
count(mask)>1and bit(i,mask)=1dp[mask][i]=in other cases.
Now the desired minimal length is . Ifp =,then there is no Hamiltonian walk in the graph. Otherwise it's easy to recover the walk itself.
Let the minimal walk end in the vertex i. Then the vertexji, for which, is the previous vertex in the path.
Now remove ifrom the set and find the vertex previous tojin the same way. Continuing
this process until only one vertex is left, we'll find the whole Hamiltonian walk.
This solution requires O(2 n)of memory and O(2 n )of time.
2. Finding the number of Hamiltonian walks
Let the graph G=(V,E)be unweighted. We'll modify the previous algorithm. Let
dp[mask][i]be the number of Hamiltonian walks on the subset mask, which end in the
vertex i. The DP is rewritten in the following way:
dp[mask][i]=1, if count(mask)=1and bit(i,mask)=1
, if count(mask)>1and
bit(i,mask)=1dp[mask][i]=0in other cases.
The answer is .
This solution requires O(2 n)of memory and O(2 n )of time.
3. Finding the number of simple paths
Calculate the DP from the previous paragraph. The answer is
. The coefficient 1/2is required because
each simple path is considered twice - in both directions. Also note that only paths of
positive length are taken into account. You can add nzero-length paths, of course.
This solution requires O(2 n)of memory and O(2 n )of time.
4. Check for existence of Hamiltonian walk
We can use solution 2 replacing the sum with bitwise OR. dp[mask][i]will contain a
boolean value - whether there exists a Hamiltonian walk over the subset maskwhich endsin the vertex i. DP is the following:
dp[mask][i]=1, if count(mask)=1and bit(i,mask)=1
, if count(mask)>1and
bit(i,mask)=1
dp[mask][i]=0in other cases.
This solution, like solution 2, requires O(2 n)of memory and O(2 n )of time. It can be
improved in the following way.
Let dp'[mask]be the mask of the subset consisting of those vertices jfor which there
exists a Hamiltonian walk over the subset maskending inj. In other words, we 'compress'
the previous DP: dp'[mask]equals . For the graph Gwriteout n masksM, which give the subset of vertices incident to the vertex i. That is,
.
DP will be rewritten in the following way:
dp'[mask]=2, if count(mask)=1and bit(i,mask)=1
Find
RodionGork My site for grey coders CodeAbbey
praveen123 Codeforces Round #251 Editorial
AkshajK Very weird bug
praveen123 Codeforces Round #251
LLint Spoj Problem
Fefer_Ivan Codeforces API
byte_gambler Codeforces round 250
byte_gambler SPOJ Fibosum
alaudo Code execution error on a lengthy input -- how to debug this issue?
huzecong Codeforces Round #248 Editorial
alliumnskbis I have a problem
ping128 Looping through all subsets of a set ofN elements
ravelo1991 About Round #251 bad things
happen on judge
Shadek Round 251 DIV 2 Problem C
yak_ex Colorize standings by used programminglanguage
yak_ex Multiple rating graph with other accounts
Tparsa Problem C (Div. 2) Round #94
t.janssen52 number of solved submissionswrong?
mobit Only div 2 contests
Egor CHelper 3.9
ErdemKirez Good Solution For 440A
Rupai SPOJ EPALIN TLE
MikeMirzayanov Frequently Asked Questions
alpha_RAU Classes of graph isomorphism
yashar_sb_sb blitz contests
Detailed
Recent actions
min
n n 2
n n 2
n n 2
n n 2
i
i
http://codeforces.com/recent-actionshttp://codeforces.com/blog/entry/12537http://codeforces.com/profile/yashar_sb_sbhttp://codeforces.com/blog/entry/12538http://codeforces.com/profile/alpha_RAUhttp://codeforces.com/blog/entry/1336http://codeforces.com/profile/MikeMirzayanovhttp://codeforces.com/blog/entry/5035http://codeforces.com/profile/Rupaihttp://codeforces.com/blog/entry/12534http://codeforces.com/profile/ErdemKirezhttp://codeforces.com/blog/entry/5408http://codeforces.com/profile/Egorhttp://codeforces.com/blog/entry/12546http://codeforces.com/profile/mobithttp://codeforces.com/blog/entry/12547http://codeforces.com/profile/t.janssen52http://codeforces.com/blog/entry/12542http://codeforces.com/profile/Tparsahttp://codeforces.com/blog/entry/1743http://codeforces.com/profile/yak_exhttp://codeforces.com/blog/entry/1871http://codeforces.com/profile/yak_exhttp://codeforces.com/blog/entry/12554http://codeforces.com/profile/Shadekhttp://codeforces.com/blog/entry/12548http://codeforces.com/profile/ravelo1991http://codeforces.com/blog/entry/12551http://codeforces.com/profile/ping128http://codeforces.com/blog/entry/12463http://codeforces.com/profile/alliumnskbishttp://codeforces.com/blog/entry/12397http://codeforces.com/profile/huzeconghttp://codeforces.com/blog/entry/12552http://codeforces.com/profile/alaudohttp://codeforces.com/blog/entry/12527http://codeforces.com/profile/byte_gamblerhttp://codeforces.com/blog/entry/12555http://codeforces.com/profile/byte_gamblerhttp://codeforces.com/blog/entry/12520http://codeforces.com/profile/Fefer_Ivanhttp://codeforces.com/blog/entry/12557http://codeforces.com/profile/LLinthttp://codeforces.com/blog/entry/12518http://codeforces.com/profile/praveen123http://codeforces.com/blog/entry/12553http://codeforces.com/profile/AkshajKhttp://codeforces.com/blog/entry/12545http://codeforces.com/profile/praveen123http://codeforces.com/blog/entry/12556http://codeforces.com/profile/RodionGork5/24/2018 A Little Bit of Classics_ Dynamic Programming Over Subsets and Paths in Graphs - Codeforces
3/5
6/5/2014 A little bit of classics: dynamic programming over subsets and paths in graphs - Codeforces
http://codeforces.com/blog/entry/337 3/5
, if
count(mask)>1
dp'[mask]=0in other cases.
Pay special attention to the expression . The first part of the
expression is the subset of vertices j, for which there exists a Hamiltonian walk over the
subset mask minus vertex i, ending inj. The second part of the expression is the set of
vertices incident to i. If these subsets have non-empty intersection (their bitwise AND is
non-zero), then it's easy to see that there exists a Hamiltonian walk in maskending in the
vertex i.
The final test is to compare dp[2 -1]to 0.
This solution uses O(2 )of memory and O(2 n)of time.
5. Finding the shortest Hamiltonian cycle
Since we don't care at which vertex the cycle starts, assume that it starts at 0. Now use
solution 1 for the subset of vertices, changing the formulas in the following way:
dp[1][0]=0
, if i>0,
bit(0,mask)=1and bit(i,mask)=1
dp[mask][i]=in other cases.
So dp[mask][i]contains the length of the shortest Hamiltonian walk over the subset mask,
starting at 0 and ending at i.
The required minimum is calculated by the formula
. If it equals , there is no Hamiltonian
cycle. Otherwise the Hamiltonian cycle can be restored by a method similar to solution 1.
6. Finding the number of Hamiltonian cycles
Using ideas from solutions 5 and 2 one can derive a DP calculating the number of
Hamiltonian cycles requiring O(2 n )of time and O(2 n)of memory.
7. Finding the number of simple cycles
Let dp[mask][i]be the number of Hamiltonian walks over the subset mask, starting at the
vertex first(mask)and ending at the vertex i. DP looks like this:
dp[mask][i]=1, if count(mask)=1and bit(i,mask)=1
, if count(mask)>1,
bit(i,mask)=1and ifirst(mask)dp[mask][i]=0 otherwise.
The answer is .
This solution requres O(2 n )of time and O(2 n)of memory.
8. Checking for existence of Hamiltonian cycle
We can modify solution 5 and, using the trick from solution 4, obtain an algorithm requiring
O(2 n)of time and O(2 )of memory.
Exercises
CFBR11D
CCTOOLS
P.S.This article may be extended and fixed in future. The author would be grateful for
supplementing the Exercises section and for pointing out any mistakes and inaccuracies.
algorithms, dynamic programming, graphs
n
n n
n 2 n
n 2 n
n n
+22 Ripatti 4 years ago 13
http://share.yandex.ru/go.xml?service=lj&url=http%3A%2F%2Fcodeforces.com%2Fblog%2Fentry%2F337&title=Codeforces%3A%20A%20little%20bit%20of%20classics%3A%20dynamic%20programming%20over%20subsets%20and%20paths%20in%20graphshttp://share.yandex.ru/go.xml?service=twitter&url=http%3A%2F%2Fcodeforces.com%2Fblog%2Fentry%2F337&title=Codeforces%3A%20A%20little%20bit%20of%20classics%3A%20dynamic%20programming%20over%20subsets%20and%20paths%20in%20graphshttp://share.yandex.ru/go.xml?service=facebook&url=http%3A%2F%2Fcodeforces.com%2Fblog%2Fentry%2F337&title=Codeforces%3A%20A%20little%20bit%20of%20classics%3A%20dynamic%20programming%20over%20subsets%20and%20paths%20in%20graphshttp://share.yandex.ru/go.xml?service=vkontakte&url=http%3A%2F%2Fcodeforces.com%2Fblog%2Fentry%2F337&title=Codeforces%3A%20A%20little%20bit%20of%20classics%3A%20dynamic%20programming%20over%20subsets%20and%20paths%20in%20graphshttp://codeforces.com/profile/Ripattihttp://codeforces.com/profile/Ripattihttp://codeforces.com/search?query=graphshttp://codeforces.com/search?query=dynamic%20programminghttp://codeforces.com/search?query=algorithmshttp://www.codechef.com/problems/TOOLShttp://codeforces.ru/contest/11/problem/D5/24/2018 A Little Bit of Classics_ Dynamic Programming Over Subsets and Paths in Graphs - Codeforces
4/5
6/5/2014 A little bit of classics: dynamic programming over subsets and paths in graphs - Codeforces
http://codeforces.com/blog/entry/337 4/5
Comments (13)
AlexErofeev
Ripatti
jaher
Ripatti
gmark
Ripatti
giongto35
giongto35
Write comment?
4 years ago, # | +3http://www.spoj.pl/problems/ASSIGN/
For example
Reply
4 years ago, # ^ | 0, )) ,
, .
, .
. , , .
:)
Reply
4 years ago, # | 0Nice tutorial. You could also add an explanation on how to count
hamiltonian circuits on a grid of size n x m with (n
5/24/2018 A Little Bit of Classics_ Dynamic Programming Over Subsets and Paths in Graphs - Codeforces
5/5
6/5/2014 A little bit of classics: dynamic programming over subsets and paths in graphs - Codeforces
http://codeforces.com/blog/entry/337 5/5
Codeforces(c) Copyright 2010-2014 Mike MirzayanovThe only programming contests Web 2.0 platform
Server time: 2014-06-05 11:42:28 (c4).
havaliza
Ripatti
saadtaame
bufferedreader
niklasb
. .
is an example problem for part 5.
Reply
4 years ago, # ^ | 0Thanx! Very nice problem)) I added it.
Reply
new, 3 days ago, # | 0
Could you please further explain the recurrence in the first example (finding
a shortest Hamiltonian walk)?
Reply
new, 3 days ago, # ^ | 0
For me too, please.Reply
new, 3 days ago, # | Rev. 3 0
The following paper is potentially useful as reference:
"A Dynamic Programming Approach to Sequencing Problems" by Michael
Held and Richard M. Karp, 1962. [citation, download]
It contains lots of preliminary analysis and at least the DP approaches
described in 1. and 5. of your post. I believe the algorithm is actually called
"HeldKarp algorithm" in academic literature, but it was described
independently by Bellman et al. in another paper.
A list of optimal algorithms for TSP with better runtime complexity can be
found here.
Reply
http://cstheory.stackexchange.com/questions/9241/approximation-algorithms-for-metric-tsp/11557#11557http://ucilnica1213.fmf.uni-lj.si/pluginfile.php/11706/mod_resource/content/0/HELDKarpAlgoritemZaPTP_clanek.pdfhttp://dl.acm.org/citation.cfm?id=808532http://www.codechef.com/problems/TOOLShttp://codeforces.com/profile/niklasbhttp://codeforces.com/profile/niklasbhttp://codeforces.com/profile/bufferedreaderhttp://codeforces.com/profile/bufferedreaderhttp://codeforces.com/profile/saadtaamehttp://codeforces.com/profile/saadtaamehttp://codeforces.com/profile/Ripattihttp://codeforces.com/profile/Ripattihttp://codeforces.com/profile/havalizahttp://codeforces.com/profile/havalizahttp://codeforces.com/