旅行商問題 斯坦納樹問題小結

2021-06-18 20:41:45 字數 1605 閱讀 3096

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...