https://www.luogu.org/problemnew/show/P1433
并不是每一个求最短距离就是bfs,这个肯定是dfs。
直接计算15!可以知道枚举必定超时,但是!
我们dfs非常方便最优性剪枝!
这个是不加最优性剪枝的版本,果断T了:
#include<bits/stdc++.h> using namespace std; #define ll long long inline double sq(double d){ return d*d; } int n; struct Point{ double x,y; double dis(Point &p){ return sqrt(sq(x-p.x)+sq(y-p.y)); } }p[16]; double ans=1e64; int used[16]; void dfs(int id,double dis,int cnt=0){ if(cnt>=n){ //ans=min(ans,dis); //printf("%.2f ",dis); if(dis<ans){ ans=dis; } } else{ for(int i=1;i<=n;i++){ if(used[i]==0/*&&dis+p[id].dis(p[i])<ans*/){ used[i]=1; dfs(i,dis+p[id].dis(p[i]),cnt+1); used[i]=0; } } } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lf%lf",&p[i].x,&p[i].y); } p[0].x=p[0].y=0; used[0]=1; dfs(0,0,0); used[0]=0; printf("%.2f ",ans); }