الگوریتم های نمایی پیدا کردن دور و مسیر همیلتونی ========================================================= در این بخش 4 الگوریتم همراه با پیاده سازی را بررسی خواهیم کرد. این 4 الگوریتم بسیار به هم شبیه هستند اما تفاوت های ریزی دارند که باید به این تفاوت ها و ایده اساسی پشت هر کدام توجه فراوان شود. مسیر همیلتونی -------------- الگوریتم 1 ~~~~~~~~~~~~~ از بخش های قبل متوجه شدیم که شرط لازم و کافی برای برای پیدا کردن دور و مسیر همیلتونی وجود ندارد. به عبارتی این یک مسئله np است و الگوریتم چند جمله ای برای آن وجود ندارد. حالا تلاش می کنیم الگوریتمی نمایی برای آن ارائه دهیم. حالا با استفاده از برنامه نویسی پویا :math:`dp_{mask, a, b}` را تعریف می کنیم که یک آرایه boolean می باشد که نشان می دهد آیا با استفاده از راس های عضو مجموعه :math:`mask` مسیری همیلتونی که از راس :math:`a` شروع شود و به راس :math:`b` ختم شود، وجود دارد یا خیر. برای آپدیت کردن این تابع کافی است روی راس قبل از :math:`b` حالت بندی کنیم. فرض کنید این راس :math:`c` باشد. لازم است :math:`c` عضو مجموعه :math:`mask` باشد همچنین یالی بین :math:`b` و :math:`c` وجود داشته باشد. در نهایت برای فهمیدن اینکه مسیر همیلتونی وجود دارد می توان :math:`dp_{2^n-1,i,j}` ها را به ازای همه :math:`i` و :math:`j` های ممکن بررسی کرد. پس پیاده سازی الگوریتم به این شکل خواهد بود : .. code-block:: cpp #define bit(n,k) (((n)>>(k))&1) const int maxn = 16; bool dp[1<> n; for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) cin >> adj[i][j]; // mohasebe dp for(int mask = 1; mask < (1<>(k))&1) const int maxn = 16; int dp[1<> n; for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) cin >> adj[i][j]; // mohasebe dp for(int mask = 1; mask < (1< #define bit(n,k) (((n)>>(k))&1) using namespace std; const int maxn = 16; bool dp[1<> n; for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) cin >> adj[i][j]; // mohasebe dp for(int mask = 1; mask < (1<>(k))&1) const int maxn = 16; int dp[1<> n; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ bool x; cin >> x; if(x){ adj_mask[i] |= 1<