洛谷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 #include4using
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...