====== فروشنده دورهگرد ======
===== تعریف =====
فرض کنید $n$ شهر و طول مسیر های بین آنها به شما داده شده است، کمترین مسافتی که باید طی شود که با شروع از یک شهر همهی شهر ها دقیقا یک بار دیده شوند و دو باره به همان شهر اولیه برگردیم چه قدر است؟
===== الگوریتم =====
این $n$ شهر را با یک گراف $n$ راسی مدل میکنیم.
از یک لیست خالی شروع می کنیم و در هر مرحله به ته لیست یک راس از همسایه های راس انتهایی لیست اضافه میکنیم و مسیر را به صورت بازگشتی کامل میکنیم. در انتها، مسیر را میبندیم و در صورتی که (طول مسیر)$B > l$ جواب کمینه را به روز رسانی میکنیم و قرار می دهیم $B=l$.در هر مرحله اگر مسیر توانایی کامل شدن به دوری با طول کمتر از $B$ نداشته باشد،به عبارت دیگر کران پایین آن ($g(p)$) از $B$ بزرگ تر باشد آن را کنار گذاشته و به مرحلهی قبل باز میگردیم.
می توان $g(p)$ را برابر با جمع طول $p$(مسیر) یعنی $l$ و طول کوتاهترین مسیر بین دو سر آن قرار داد. یا این که برابر با $l+(n-s)*x$ که $s$ اندازهی $p$ و x طول کم وزن ترین یال در بین راس های باقی مانده است در نظر گرفت، زیرا برای برگشت حتما باید $n-s$ راس پیموده شود و هر پیمایش حداقل به اندازهی مسافت $x$ هزینه خواهد داشت.این کران را میتوان با متغیر در نظر گرفتن x بهبود داد یعنی $g(p)=l+\Sigma{x_i}$ که $x_i$ وزن کموزن ترین یال ورودیی راس $i$ در بین راس های پیمایش نشده است.
===== پیچیدگی الگوریتم =====
زمان اجرای این الگوریتم $O(n!)$ است.
===== پیادهسازی اولیه =====
#include #include
#include
#include
#include
#include
#include
#include
#include
===== پیادهسازی سریعتر =====
#include
int main() {
}
===== کابردها =====
**مثال**:
صورت مسئله اینجا میآید.
<پاسخ>
پاسخ مسئله اینجا میآید
پاسخ>
===== مسائل نمونه =====
* [[سوالات_المپیاد:دورهی_تابستان:دورهی_۲۴:عملی_مقدماتی_اول:سوال_۱|سوال عملی دورهی تابستان ۲۴]] [سطح: ساده]
===== مراجع =====
* [[http://e-maxx.ru/algo/euler_function|تابع اویلر - سایت ماکزیمال]]
* [[http://en.wikipedia.org/wiki/Euler%27s_totient_function|تابع اویلر - ویکیپدیا]]