這裡所需要的剪枝一共有三種
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年。當然,任意兩個島之間的航行時間雖然差別很大,...