洛谷P1171 售貨員的難題 Tsp問題

2022-08-05 03:03:22 字數 1477 閱讀 6703

洛谷p1171 售貨員的難題

狀壓dp

1 #include 2

#define for(i,j,k) for(int i=j;i<=k;i++)

3#define min(a,b) ((a) < (b) ? (a) : (b))

4using

namespace

std ; 56

const

int n = 21,inf =1e8 ;

7int

n,mi,all ;

8int

dis[n][n];

9int dp[n][1

<<20

] ;

10int bin[22

] ;

1112 inline int

read() 13

17while(ch>='

0'&&ch<='

9')

18return x *f ; 19}

2021

intmain()

2238 mi =inf ;

39 for(i,2

,n)

40if( dp[i][all]+dis[i][1] < mi ) mi = dp[i][all]+dis[i][1

] ;

41 printf("

%d\n

",mi) ;

42return0;

43 }

搜尋

1 #include2 #include3 #include4

using

namespace

std;

5int n,min1=200010,sum,minv[21],mind=200010;6

bool vis[21];7

struct

nodea[21][21],b[21

];10

void dfs(int q,int

last)

15for(int i=2;i<=n;i++)

16if(!vis[a[last][i].id])27}

28bool

cmp(node a,node b)

31int

main()

38 minv[i]=a[i][1].dis;//

minv[i]表示i村莊到1的距離

39if(i!=1)mind=min(mind,minv[i]);//

表示所有村莊到1的最短距離(不包括1到1)

40 sort(a[i]+1,a[i]+n+1,cmp);//

讀資料時每次得到一行的值後對邊值排序。這樣可以更快得到較優值。 41}

42 vis[1]=1

;43 dfs(1,1

);44 cout<45return0;

46 }

洛谷 P1171 售貨員的難題

經典的旅行商問題 dp i j 表示從j出發,去遍歷狀態為i的點,並且回到起點的最短路徑長度 初始化 dp 0 i dis i,起點 即從點i哪兒哪兒也不遍歷,直接回到起點的路徑長度 對於每乙個狀態i,列舉要從哪個點出發,去遍歷這個狀態 然後列舉這個點要直接前往的狀態中的某個點 最後輸出dp 總狀態...

P1171 售貨員的難題

資料有更改 某鄉有n個村莊 11輸入格式 村莊數n和各村之間的路程 均是整數 輸出格式 最短的路程。輸入樣例 1 3 0 2 1 1 0 2 2 1 0 輸出樣例 1 3 輸入解釋 3 0 2 1 1 0 2 2 1 0 solution 法一 經典的狀壓dp題目。設f i j 表示某個狀態的最短距...

P1171 售貨員的難題

題目描述 某鄉有nn個村莊 1 1 all 1 路徑總長度最小 除錯日誌 又把 1 i 1 寫成了 1 num 1 小插曲 卡空間卡到阿蘇發稿地方od撒龍捲風no,然後這題常規做法只能開 o 過 經典狀壓dp dp i j 表示 i 狀態下最後乙個點走 j 的最短路徑長度 轉移見 include i...