//Author: Rohan
// Credits to-Aditya Nugroho
//referred from-
//http://w...content-available-to-author-only...d.com/doc/50049931/Final-Report-Solving-Traveling-Salesman-Problem-by-Dynamic-Programming-Approach-in-Java-Program-Aditya-Nugroho-Ht083276e
//commented and understood myself :)
#include <stdio.h>
#include<limits.h>
#define size 10 //maximum 10 cities
#define min(a,b) a>b?b:a
#define sizePOW 1024 // 2^10
//Space complexity: O(n * 2^n)
//Time complexity: O(n^2 * 2^n)
int n,npow,g[size][sizePOW],p[size][sizePOW],adj[size][size];
int compute(int start,int set)
{ int masked,mask,result=INT_MAX,temp,i;//result stores the minimum
if(g[start][set]!=-1)//memoization DP top-down,check for repeated subproblem
return g[start][set];
for(i=0;i<n;i++)
{ //npow-1 because we always exclude "home" vertex from our set
mask=(npow-1)-(1<<i);//remove ith vertex from this set
masked=set&mask;
if(masked!=set)//in case same set is generated(because ith vertex was not present in the set hence we get the same set on removal) eg 12&13=12
{
temp=adj[start][i]+compute(i,masked);//compute the removed set
if(temp<result)
result=temp,p[start][set]=i;//removing ith vertex gave us minimum
}
}
return g[start][set]=result;//return minimum
}
void getpath(int start,int set)
{
if(p[start][set]==-1) return;//reached null set
int x=p[start][set];
int mask=(npow-1)-(1<<x);
int masked=set&mask;//remove p from set
getpath(x,masked);
}
void TSP()
{ int i,j;
//g(i,S) is length of shortest path starting at i visiting all vertices in S and ending at 1
for(i=0;i<n;i++)
for(j=0;j<npow;j++)
g[i][j]=p[i][j]=-1;
for(i=0;i<n;i++)g[i][0]=adj[i][0];//g(i,nullset)= direct edge between (i,1)
int result=compute(0,npow-2);//npow-2 to exclude our "home" vertex
printf("Tour cost:%d\n",result
); getpath(0,npow-2);
}
int main(void) {
int i,j;
printf("Enter number of cities\n"); npow
=(int)pow(2,n
);//bit number required to represent all possible sets printf("Enter the adjacency matrix\n"); for(i
=0;i
<n
;i
++)for(j
=0;j
<n
;j
++)scanf("%d",&adj
[i
][j
]); TSP();
return 0;
}
/*
Recursion tree for given input
g(0,{1,2,3})
14
/ | \
12 10 6
g(1,{2,3}) g(2,{1,3}) g(3,{1,2})
/ \ / \ | \
8 4 8 2 4 2
g(2,{3}) g(3,{2}) g(1,{3}) g(3,{1}) g(1,{2}) g(2,{1})
/ | | | | |
0 0 0 0 0 0
g(3,null) g(2,null) g(3,null) g(1,null) g{2,null) g(1,null)
*/
Ly9BdXRob3I6IFJvaGFuCi8vIENyZWRpdHMgdG8tQWRpdHlhIE51Z3JvaG8KLy9yZWZlcnJlZCBmcm9tLQovL2h0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5kLmNvbS9kb2MvNTAwNDk5MzEvRmluYWwtUmVwb3J0LVNvbHZpbmctVHJhdmVsaW5nLVNhbGVzbWFuLVByb2JsZW0tYnktRHluYW1pYy1Qcm9ncmFtbWluZy1BcHByb2FjaC1pbi1KYXZhLVByb2dyYW0tQWRpdHlhLU51Z3JvaG8tSHQwODMyNzZlCi8vY29tbWVudGVkIGFuZCB1bmRlcnN0b29kIG15c2VsZiA6KQojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGU8bGltaXRzLmg+CiNkZWZpbmUgc2l6ZSAxMCAvL21heGltdW0gMTAgY2l0aWVzCiNkZWZpbmUgbWluKGEsYikgYT5iP2I6YQojZGVmaW5lIHNpemVQT1cgMTAyNCAvLyAyXjEwCi8vU3BhY2UgY29tcGxleGl0eTogTyhuICogMl5uKQovL1RpbWUgY29tcGxleGl0eTogTyhuXjIgKiAyXm4pCmludCBuLG5wb3csZ1tzaXplXVtzaXplUE9XXSxwW3NpemVdW3NpemVQT1ddLGFkaltzaXplXVtzaXplXTsKaW50IGNvbXB1dGUoaW50IHN0YXJ0LGludCBzZXQpCnsJaW50IG1hc2tlZCxtYXNrLHJlc3VsdD1JTlRfTUFYLHRlbXAsaTsvL3Jlc3VsdCBzdG9yZXMgdGhlIG1pbmltdW0gCglpZihnW3N0YXJ0XVtzZXRdIT0tMSkvL21lbW9pemF0aW9uIERQIHRvcC1kb3duLGNoZWNrIGZvciByZXBlYXRlZCBzdWJwcm9ibGVtCgkJcmV0dXJuIGdbc3RhcnRdW3NldF07Cglmb3IoaT0wO2k8bjtpKyspCgkJewkvL25wb3ctMSBiZWNhdXNlIHdlIGFsd2F5cyBleGNsdWRlICJob21lIiB2ZXJ0ZXggZnJvbSBvdXIgc2V0CgkJCW1hc2s9KG5wb3ctMSktKDE8PGkpOy8vcmVtb3ZlIGl0aCB2ZXJ0ZXggZnJvbSB0aGlzIHNldAoJCQltYXNrZWQ9c2V0Jm1hc2s7CgkJCWlmKG1hc2tlZCE9c2V0KS8vaW4gY2FzZSBzYW1lIHNldCBpcyBnZW5lcmF0ZWQoYmVjYXVzZSBpdGggdmVydGV4IHdhcyBub3QgcHJlc2VudCBpbiB0aGUgc2V0IGhlbmNlIHdlIGdldCB0aGUgc2FtZSBzZXQgb24gcmVtb3ZhbCkgZWcgMTImMTM9MTIKCQkJewkKCQkJCXRlbXA9YWRqW3N0YXJ0XVtpXStjb21wdXRlKGksbWFza2VkKTsvL2NvbXB1dGUgdGhlIHJlbW92ZWQgc2V0CgkJCQlpZih0ZW1wPHJlc3VsdCkKCQkJCQlyZXN1bHQ9dGVtcCxwW3N0YXJ0XVtzZXRdPWk7Ly9yZW1vdmluZyBpdGggdmVydGV4IGdhdmUgdXMgbWluaW11bQoJCQl9CgkJfQoJCXJldHVybiBnW3N0YXJ0XVtzZXRdPXJlc3VsdDsvL3JldHVybiBtaW5pbXVtCn0Kdm9pZCBnZXRwYXRoKGludCBzdGFydCxpbnQgc2V0KQp7CglpZihwW3N0YXJ0XVtzZXRdPT0tMSkgcmV0dXJuOy8vcmVhY2hlZCBudWxsIHNldAoJaW50IHg9cFtzdGFydF1bc2V0XTsKCWludCBtYXNrPShucG93LTEpLSgxPDx4KTsKCWludCBtYXNrZWQ9c2V0Jm1hc2s7Ly9yZW1vdmUgcCBmcm9tIHNldAoJcHJpbnRmKCIlZCAiLHgpOwoJZ2V0cGF0aCh4LG1hc2tlZCk7Cn0Kdm9pZCBUU1AoKQp7CWludCBpLGo7CgkvL2coaSxTKSBpcyBsZW5ndGggb2Ygc2hvcnRlc3QgcGF0aCBzdGFydGluZyBhdCBpIHZpc2l0aW5nIGFsbCB2ZXJ0aWNlcyBpbiBTIGFuZCBlbmRpbmcgYXQgMQoJZm9yKGk9MDtpPG47aSsrKQoJCWZvcihqPTA7ajxucG93O2orKykgCgkJCQlnW2ldW2pdPXBbaV1bal09LTE7IAoJZm9yKGk9MDtpPG47aSsrKWdbaV1bMF09YWRqW2ldWzBdOy8vZyhpLG51bGxzZXQpPSBkaXJlY3QgZWRnZSBiZXR3ZWVuIChpLDEpCglpbnQgcmVzdWx0PWNvbXB1dGUoMCxucG93LTIpOy8vbnBvdy0yIHRvIGV4Y2x1ZGUgb3VyICJob21lIiB2ZXJ0ZXgKCXByaW50ZigiVG91ciBjb3N0OiVkXG4iLHJlc3VsdCk7CglwcmludGYoIlRvdXIgcGF0aDpcbjAgIik7CglnZXRwYXRoKDAsbnBvdy0yKTsKCXByaW50ZigiMFxuIik7Cn0KaW50IG1haW4odm9pZCkgewoJaW50IGksajsKCXByaW50ZigiRW50ZXIgbnVtYmVyIG9mIGNpdGllc1xuIik7CglzY2FuZigiJWQiLCZuKTsKCW5wb3c9KGludClwb3coMixuKTsvL2JpdCBudW1iZXIgcmVxdWlyZWQgdG8gcmVwcmVzZW50IGFsbCBwb3NzaWJsZSBzZXRzCglwcmludGYoIkVudGVyIHRoZSBhZGphY2VuY3kgbWF0cml4XG4iKTsKCWZvcihpPTA7aTxuO2krKylmb3Ioaj0wO2o8bjtqKyspc2NhbmYoIiVkIiwmYWRqW2ldW2pdKTsKCVRTUCgpOwoJcmV0dXJuIDA7Cn0KLyoKUmVjdXJzaW9uIHRyZWUgZm9yIGdpdmVuIGlucHV0CgkJCQkJICAgICAJZygwLHsxLDIsM30pCgkJCQkJCQkJCTE0CiAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgXAoJCTEyCQkJCQkJCTEwICAgICAgICAgICAgICAgNgogICAgZygxLHsyLDN9KSAgICAgICAgICAgICAgICBnKDIsezEsM30pICAgICAgICAgICAgZygzLHsxLDJ9KQoKICAgIC8gICAgICAgICBcICAgICAgICAgICAgIC8gICAgICAgICAgXCAgICAgICAgICAgICB8ICAgICAgIFwKICA4ICAgICAgICAgICAgNCAgICAgICAgICA4ICAgICAgICAgICAgIDIgICAgICAgICAgIDQgICAgICAgICAgIDIKZygyLHszfSkgICBnKDMsezJ9KSAgICAgZygxLHszfSkgICAgIGcoMyx7MX0pICAgIGcoMSx7Mn0pICAgIGcoMix7MX0pICAKCiAgLyAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgCiAwICAgICAgICAgICAgIDAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAgIDAKZygzLG51bGwpICAgZygyLG51bGwpICAgIGcoMyxudWxsKSAgIGcoMSxudWxsKSAgIGd7MixudWxsKSAgICBnKDEsbnVsbCkKKi8K