不懂就问这道题dfs能做吗,我tle了,有没有大佬用dfsAC了的
#include<bits/stdc++.h>
using namespace std;
#define d double
d distance(d x1, d y1, d x2, d y2){
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
int n = 0;
d ans = 0.0;//记录距离和最小值
d sum = 0.0;//记录不同走法下的距离和
d x[20] = {0.0};
d y[20] = {0.0};
d dis[20][20] = {0.0};//(i,j)之间距离
int s[20] = {0};//记录每一步走的点
bool era[20] = {false};//记录点有没有使用过
void dfs(int num){
if(num > n){
ans = min(ans, sum);
return;
}
for(int i = 1; i <= n; i++){
if(era[i] == false){
era[i] = true;
s[num] = i;
sum += dis[i][s[num - 1]];
dfs(num + 1);
sum -= dis[i][s[num - 1]];
s[num] = 0;
era[i] = false;
}
}
}
int main(){
cin>>n;
ans = 1e9 * 1.0;
for(int i = 1; i <= n; i++){
cin>>x[i]>>y[i];
}
for(int i = 0; i <= n; i++){
for(int j = i; j <= n; j++){
dis[i][j] = distance(x[i], y[i], x[j], y[j]);
dis[j][i] = dis[i][j];
}
}
dfs(1);
printf("%.2lf", ans);
return 0;
}