這個是經典狀態壓縮dp tsp問題的變形
首先來看看《挑戰程式設計競賽》講解tsp問題:
給定乙個n個定頂點組成的帶權有向圖的距離矩陣d(i,j)(inf表示沒有變)。要求從頂點0出發,經過每個頂點恰好一次後再回到頂點0。問所經過得邊的總權重的最小值是多少?
限制條件 1
0tsp問題是np困難的。沒有已知的的多項式時間的高效演算法可以解決這一問題。
所有可能的路線共有(n-1)!種。這是個非常大的值。即使在本題中n已經很小了。仍然無法試遍每一種情況。對於這個問題我們可以使用dp來解決。首先讓我們試著寫出它的遞推式。
假設現在已經訪問過得頂點的集合(起點0當做還未訪問過的頂點)為s.當前所在頂點為v,用dp[s][v]表示從v出發訪問剩餘的所有頂點。最終回到頂點0的路徑的權重總和的最小值。由於從v出發可以移動到任意乙個節點u不屬於s,因此有如下遞推式:
dp[v][0]=0;
dp[s][v]=min][u]+d(v,u)|u不屬於s};
我只要按照這個遞推式進行計算就可以了。這樣就可以在o(2^n*n^2)的時間裡完成計算。
時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:4 描述
有n個城市,乙個人去旅遊,他想遊遍n個城市,且每個城市最多去兩次,問最短的路程是多少。
起點任意,每兩個城市之間可能會有多條路,也可能會沒有路。如果能遊遍所有的城市
輸出最少的,不能的話輸出-1
輸入有多組測試資料,每組都有乙個正整數n和m(n>1&&n<=10,m>0)
n表示由n個城市,接下來有m行,每行三個正整數,u,v,w表示
u和v之間有一條長為w的路(w>=0&&w<300)。
輸出每組資料輸出一行,如果能遊遍所有的城市,輸出最短的距離,如果不能,輸出-1
樣例輸入
樣例輸入
這道題與經典tsp問題用的是同一種dp遞推式。區別是:(1)不需要迴路(2)頂點限制的次數+1
經典tsp問題它要求頂點只能遍歷一次,所以對於dp的狀態,記錄的是該頂點的入度。而在這道題裡入度的要求則變成了indegree小於等於2.所以問題就從經典tsp的二進位制的狀態壓縮變成了三進製的狀態壓縮.
對於三進製的狀態轉移因為不能用位運算了,所以就要對三進製的操作進行預處理並用陣列儲存。
#include #include #include #define max_v 12
#define inf 0x3f3f3f3f
int n,m;
int g[max_v][max_v];
int ter[60000][max_v];//ter[s][v]表示在s狀態中v頂點的入度
int bit=;
int dp[60000][max_v];
int findmin(int x,int y)
void ternary_init()
int ans=inf;
for(int s=0;s=2)
continue;
dp[s+bit[v]][v]=findmin(dp[s+bit[v]][v],dp[s][u]+g[u][v]);//狀態轉移}}
if(flag)
{//所有頂點的入度都大於0
for(u=0;u
1182 合影效果
時間限制 1000 ms 記憶體限制 65536 kb 提交數 2035 通過數 1172 小雲和朋友們去爬香山,為美麗的景色所陶醉,想合影留念。如果他們站成一排,男生全部在左 從拍照者的角度 並按照從矮到高的順序從左到右排,女生全部在右,並按照從高到矮的順序從左到右排,請問他們合影的效果是什麼樣的...
1182 合影效果
題目描述 小雲和朋友們去爬香山,為美麗的景色所陶醉,想合影留念。如果他們站成一排,男生全部在左 從拍照者的角度 並按照從矮到高的順序從左到右排,女生全部在右,並按照從高到矮的順序從左到右排,請問他們合影的效果是什麼樣的 所有人的身高都不同 輸入 第一行是人數n 2 n 40,且至少有1個男生和1個女...
1182 統計單詞
題目描述 編乙個程式,讀入使用者輸入的,以 結尾的一行文字,統計一共有多少個單詞,並分別輸出每個單詞含有多少個字元。凡是以乙個或多個空格隔開的部分就為乙個單詞 輸入 輸入包括1行字串,以 結束,字串中包含多個單詞,單詞之間以乙個或多個空格隔開。輸出 可能有多組測試資料,對於每組資料,輸出字串中每個單...