「我是要成為海賊王的男人!」
路飛他們偉大航路行程的起點是羅格鎮,終點是拉夫德魯(那裡藏匿著「唯一的大秘寶」——one piece)。而航程中間,則是各式各樣的島嶼。
因為偉大航路上的氣候十分異常,所以來往任意兩個島嶼之間的時間差別很大,從a島到b島可能需要1天,而從b島到a島則可能需要1年。當然,任意兩個島之間的航行時間雖然差別很大,但都是已知的。
現在假設路飛一行從羅格鎮(起點)出發,遍歷偉大航路中間所有的島嶼(但是已經經過的島嶼不能再次經過),最後到達拉夫德魯(終點)。假設他們在島上不作任何的停留,請問,他們最少需要花費多少時間才能到達終點?
輸入輸入資料報含多行。
第一行包含乙個整數n(2 < n ≤ 16),代表偉大航路上一共有n個島嶼(包含起點的羅格鎮和終點的拉夫德魯)。其中,起點的編號為1,終點的編號為n。
之後的n行每一行包含n個整數,其中,第i(1 ≤ i ≤ n)行的第j(1 ≤ j ≤ n)個整數代表從第i個島嶼出發到第j個島嶼需要的時間t(0 < t < 10000)。第i行第i個整數為0。輸出輸出為乙個整數,代表路飛一行從起點遍歷所有中間島嶼(不重複)之後到達終點所需要的最少的時間。樣例輸入
樣例輸入1:樣例輸出40 10 20 999
5 0 90 30
99 50 0 10
999 1 2 0
樣例輸入2:
50 18 13 98 8
89 0 45 78 43
22 38 0 96 12
68 19 29 0 52
95 83 21 24 0
樣例輸出1:100樣例輸出2:
137
題目如上
如題,第一想法是深搜(據說可以用dp,但還沒想出來),寫了一版深搜,結果超時了,意料之中,下面附**以及剪枝。
#include#include#include#includeconst int inf = 0x3f3f3f3f; int step; int minstep; int a[16][16]; int book[15]; int postion[20]; int n; int npostion[15][1<<15]; int po; void dfs(int cur,int qc) for(int i=1; i-1; i++) } } int main() { for(int i=0; i<14; i++) postion[i]=1<; while (~scanf("%d",&n)) { po=0; step=0; minstep=1e17; memset(npostion,inf,sizeof(npostion)); memset(a,0,sizeof(a)); memset(book,0,sizeof(book)); for(int i=0; i; i++) for(int j=0; j; j++) scanf("%d",&a[i][j]); dfs(0,0); printf("%d\n"
ACM 海賊王之偉大航路 深搜剪枝
我是要成為海賊王的男人!路飛他們偉大航路行程的起點是羅格鎮,終點是拉夫德魯 那裡藏匿著 唯一的大秘寶 one piece 而航程中間,則是各式各樣的島嶼。因為偉大航路上的氣候十分異常,所以來往任意兩個島嶼之間的時間差別很大,從a島到b島可能需要1天,而從b島到a島則可能需要1年。當然,任意兩個島之間...
ACM 海賊王之偉大航路 深搜剪枝
我是要成為海賊王的男人!路飛他們偉大航路行程的起點是羅格鎮,終點是拉夫德魯 那裡藏匿著 唯一的大秘寶 one piece 而航程中間,則是各式各樣的島嶼。因為偉大航路上的氣候十分異常,所以來往任意兩個島嶼之間的時間差別很大,從a島到b島可能需要1天,而從b島到a島則可能需要1年。當然,任意兩個島之間...
ACM 海賊王之偉大航路 深搜剪枝
我是要成為海賊王的男人!路飛他們偉大航路行程的起點是羅格鎮,終點是拉夫德魯 那裡藏匿著 唯一的大秘寶 one piece 而航程中間,則是各式各樣的島嶼。因為偉大航路上的氣候十分異常,所以來往任意兩個島嶼之間的時間差別很大,從a島到b島可能需要1天,而從b島到a島則可能需要1年。當然,任意兩個島之間...