poj 3311
旅行商問題
題意就是從乙個點出發遍歷所有點回到原地所需最短時間
狀態dp[st][i]表示經過了st中標記的點,現在在i點的最小經過距離
比較水,略了
#include #include #include #include #include using namespace std;
const int maxn=10+2;
const int inf=0x3f3f3f3f;
int n;
int dis[maxn][maxn];
int dp[1<<12][maxn];
void floyd()
void work()
列舉k和i
dp[st][k]=min
這個有迴圈,則從dp[st][k]小的開始算(可以從小的開始算,也可以從小的開始更新)
在求完所有dp值後就進行神一般的計算結果...
看了好久**才看懂
先列舉1-2^8-1的所有狀態
這樣每2位就是0-3的乙個數,代表4個要求所在的組
把每組的值加起來就是這乙個狀態的答案
(即列舉狀態就是列舉分組情況)
比如00011111就是第乙個和第二個要求為一組,第三個要求為一組,第四個要求為一組,答案為dp[00001111]+dp[00110000]+dp[11000000]
然後求最小值就是答案了
複雜度:n^3+2^8*(n*2^8+n^2)+2^8*n^2=2^16*n
#include #include #include #include #include using namespace std;
const int maxn=30+10;
const int inf=0x3f3f3f3f;
int n,m;
mapmp;
int dis[maxn][maxn];
int dp[300][maxn];
int goal[8];//4對目標
bool vis[maxn];
void floyd()
for(int i=0;i>f>>t>>d;
fr=mp[f];
to=mp[t];
dis[fr][to]=dis[to][fr]=min(dis[fr][to],d);
}for(int i=0;i<8;i++)
}void init()
這樣就800ms過了
#include #include #include #include using namespace std;
const int maxn=50+10;
const int inf=1000*10000+100;
int n,m,k;
int dis[maxn][maxn];
int dp[1<<11][maxn];
int ans[1<<11];
bool vis[maxn];
bool check(int st)
void floyd()
void input()
{ int f,t,v;
for(int i=0; i
斯坦納樹與旅行商問題
啥也別說了,先上圖 討論了整整四個小時,只討論了不到兩章,我的那章還沒講完,真佩服我們。不過,印證了真理總是越辯越明這句話,通過這一次的討論,對於我自己的那章,我都收穫良多。下面會寫一下聽第三章斯坦納樹和旅行商問題的理解和感悟。首先,斯坦納樹在近似演算法中佔據了核心地位,其定義為 給定乙個帶權的無向...
旅行商問題
旅行商問題 乙個商人從城市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...