百練 4124 海賊王的偉大航路

2021-07-15 08:14:01 字數 865 閱讀 6862

這裡所需要的剪枝一共有三種

1.若走到現在的路程已經大於等於之前擴充套件的最優路程,則剪枝;

2.設乙個估計函式,這個估計函式是現在已經還沒有走的點,若有c1,c2...cn,則取終點為c1的最短路徑,到c2的最短路徑....到cn的最短路徑,他們之和相加若仍然大於等於之前擴充套件的最優路程,那麼就不用繼續擴充套件這條路了;

3.設定乙個狀態,這個狀態定義了f(v,s),v代表目前已經走到過的城市終點,s代表已經走過的城市的集合,那麼等到如果有相同情況(相同的終點,相同的走過的城市的集合)的話,那麼如果走過的路程大於等於之前走過的,那麼不用擴充套件了,如果小於,則更新f(v,s);

注意上方劃橫線的等於,如果等於的話那麼也沒必要擴充套件了,因為即便擴充套件,最優也只會與之前的最優相等,所以這個擴充套件是沒有意義的,我就是一開始沒有加等於,導致超時,花費時間在1024ms左右,加上等於之後ac時間是35ms。

#include#include#include#includeusing namespace std;

const int maxn=20;

int g[maxn][maxn],vis[maxn],minp[maxn],f[maxn][(1<<14)];

int n,cost,bestcost;

void dfs(int u,int cur,int s)

for(int i=1;i<=n;i++)

}}int main()

minp[i]=ans;

}vis[1]=1;

cost=0;bestcost=(1<<30);

dfs(1,1,1);

printf("%d\n",bestcost);

return 0;

}

百練4124 海賊王之偉大航路

路飛他們偉大航路行程的起點是羅格鎮,終點是拉夫德魯 那裡藏匿著 唯一的大秘寶 one piece 而航程中間,則是各式各樣的島嶼。因為偉大航路上的氣候十分異常,所以來往任意兩個島嶼之間的時間差別很大,從a島到b島可能需要1天,而從b島到a島則可能需要1年。當然,任意兩個島之間的航行時間雖然差別很大,...

海賊王之偉大航路

題目鏈結 思路 基本狀壓dp 看題目知道此題求的是最短哈密頓路徑,也就是一條從1到n的經過所有點的最短路徑。我們可以使用狀態壓縮,使用乙個二進位制數state代表一種狀態,state代表經過的所有點的集合。例如state 1,代表只經過1號點。state 3 二進位制為0011 代表經過1號點和2號...

海賊王之偉大航路

路飛他們偉大航路行程的起點是羅格鎮,終點是拉夫德魯 那裡藏匿著 唯一的大秘寶 one piece 而航程中間,則是各式各樣的島嶼。因為偉大航路上的氣候十分異常,所以來往任意兩個島嶼之間的時間差別很大,從a島到b島可能需要1天,而從b島到a島則可能需要1年。當然,任意兩個島之間的航行時間雖然差別很大,...