旅行商問題

2022-06-22 20:57:10 字數 1358 閱讀 4252

題意:旅行商問題,即從 \(1\) 走到 \(n\) 不重不漏,然後求最小距離。

題解:狀態壓縮dp,顯然的是,要從某種狀態到某種狀態並且合法,然後取 \(min\),然後全部遍歷。所以設 \(dp_\) 的含義是,最後乙個點是 \(i\) 點,然後走過了 \(j\) 這個 \(01\) 串的有 \(1\) 的點。然後要想的是順序問題,那麼我們必然是從上乙個點推到 \(i\) 點,所以可以遍歷所有點,然後得到 \(k\) 點,\(k\) 點一定是在這個 \(j\) 裡面,然後那麼 $$dp_ = min, dp_}$$。

**:

#include #include #include #include #include #include using namespace std;

typedef long long ll;

const int n = 21;

int dp[n][1 << n];

int w[n][n];

void solve()

}memset(dp, 0x3f, sizeof dp);

dp[0][1] = 0;

for (int j = 0; j < 1 << n; j++) }}

}}

cout << dp[n - 1][(1 << n) - 1] << endl;

}int main()

題意:旅行商問題裸題,只不過多出來一項操作是不重不漏走完,並且還要回到原點,也沒啥,如果理解了旅行商問題的 \(dp\) 方程代表含義,就很簡單。

**:

#include #include #include #include #include #include using namespace std;

typedef long long ll;

const ll n = 29;

struct node a[22];

bool check(ll j, ll k, ll n) }}

}return 1;

}ll w[n][n];

ll dp[n][1 << 18];

void solve()

}memset(dp , 0x3f, sizeof dp);

dp[0][1] = 0;

for (ll j = 0; j < 1 << n; j++) }}

}ll ans = 0x7fffffff;

for (ll i = 1; i < n; i++) ans = min(ans, dp[i][ (1 << n) - 1] + w[i][0]);//多出來了這個,就是知道了dp陣列含義後,就很簡單

cout << ans << endl;

}signed main()

旅行商問題

旅行商問題 乙個商人從城市a出發,訪問bcde等城市各一次最後回到a,問行程如何使得路程或費用最低。這是個np 非多項式可解,但一般驗證容易 問題,假設中間有4個城市,那麼全排列為4!24種,沒有很好的演算法,基本只能窮舉了。class vertex 4 public class lianxi pu...

旅行商問題

一銷售商從n個城市中的某一城市出發,不重複地走完其餘n 1個城市並回到原出發點,在所有可能的路徑中求出路徑長度最短的一條。本題假定該旅行商從第1個城市出發。對每個測試例,第1行有兩個整數 n 4 n 10 和m 4 m 20 n是結點數,m是邊數。接下來m行,描述邊的關係,每行3個整數 i,j le...

旅行商問題(貪婪法)

h greedytsp.h created on 2011 7 12 author 哈哈 ifndef greedytsp h define greedytsp h include using namespace std include include void printstate vector ...