洛谷 - P1433 - 吃奶酪 - dfs

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\n",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\n",ans);
}

 

posted @ 2019-04-05 16:06  韵意  阅读(189)  评论(0编辑  收藏  举报