洛谷 P1433 吃奶酪 Label:dfs && 剪枝Ex

题目描述

房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。

输入输出格式

输入格式:

第一行一个数n (n<=15)

接下来每行2个实数,表示第i块奶酪的坐标。

两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

输出格式:

一个数,表示要跑的最少距离,保留2位小数。

输入输出样例

输入样例#1:

4
1 1
1 -1
-1 1
-1 -1

输出样例#1:

7.41

代码

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<vector>
 5 #include<cmath>
 6 #include<map>
 7 #include<algorithm>
 8 #define INF 0x3f3f3f3f
 9 using namespace std;
10
11 map<int,double> m;
12 vector<int> G[20];
13 vector<double> c[20];
14 int N,vis[20];
15 double ans=INF;
16
17 struct cc{
18     double x,y;
19 }nod[20];
20
21 double dis(int a,int b){
22     return sqrt((nod[a].x-nod[b].x)*(nod[a].x-nod[b].x)+(nod[a].y-nod[b].y)*(nod[a].y-nod[b].y));
23 }
24
25 int look_up_table(double len){
26     long long H=0;
27     for(int i=1;i<=N;i++){
28         if(vis[i]) H=H*10+i;
29     }
30     if(m.count(H)){
31         if(len>m[H]) return 0;
32         m[H]=len;
33         return 1;
34     }
35     else{
36         m[H]=len;
37         return 1;
38     }
39 }
40
41
42 void search(int x,int dep,double len){
43     if(len>=ans) return;
44     if(!look_up_table(len)) return;
45     if(dep==N){
46         ans=min(len,ans);
47         return;
48     }
49     vis[x]=1;
50 //    puts("$");
51     for(int i=0;i<G[x].size();i++){
52         int now=G[x][i];
53         if(!vis[now]) search(now,dep+1,len+c[x][i]);
54     }
55
56     vis[x]=0;
57 }
58
59 int main(){
60 //    freopen("01.in","r",stdin);
61     scanf("%d",&N);
62     for(int i=1;i<=N;i++){
63         cin>>nod[i].x>>nod[i].y;
64         //scanf("%lf",&nod[i].x,&nod[i].y);
65     }
66     nod[0].x=nod[0].y=0.0;
67     for(int i=0;i<=N;i++){
68         for(int j=i+1;j<=N;j++){
69             G[i].push_back(j);
70             c[i].push_back(dis(i,j));
71
72             G[j].push_back(i);
73             c[j].push_back(dis(i,j));
74         }
75     }
76     search(0,0,0.0);
77     printf("%.2lf",ans);
78     return 0;
79 }

90分 的map>_<

//以上为map,意料之外啊

hash貌似不可以,因为自己的数据都过不了,就没有提交

至于评测的时候我觉得直接STL就好,hash试一试吧

看了下题解,我竟无言以对

回溯以及剪枝。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<vector>
 5 #include<cmath>
 6 #include<map>
 7 #include<algorithm>
 8 #define INF 0x3f3f3f3f
 9 using namespace std;
10
11 int N,vis[20];
12 double ans=INF;
13
14 struct cc{
15     double x,y;
16 }nod[20];
17
18 double dis(int a,int b){
19     return sqrt((nod[a].x-nod[b].x)*(nod[a].x-nod[b].x)+(nod[a].y-nod[b].y)*(nod[a].y-nod[b].y));
20 }
21
22 void search(int x,int dep,double len){
23     if(len>=ans) return;
24     if(dep==N){
25         ans=min(len,ans);
26         return;
27     }
28
29     for(int i=1;i<=N;i++){
30         if(i==x)continue;
31         if(!vis[i]){
32             vis[i]=1;
33             search(i,dep+1,len+dis(x,i));
34             vis[i]=0;
35         }
36     }
37
38 }
39
40 int main(){
41 //    freopen("01.in","r",stdin);
42     scanf("%d",&N);
43     for(int i=1;i<=N;i++)cin>>nod[i].x>>nod[i].y;
44     search(0,0,0.0);
45     printf("%.2lf",ans);
46     return 0;
47 }

完了?

行吧,电脑渣13个点的数据用暴力都跑不出来怪谁咯

时间: 2024-08-06 16:05:30

洛谷 P1433 吃奶酪 Label:dfs && 剪枝Ex的相关文章

洛谷 P1433 吃奶酪

题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块奶酪的坐标. 两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 输出格式: 一个数,表示要跑的最少距离,保留2位小数. 输入输出样例 输入样例#1: 4 1 1 1 -1 -1 1 -1 -1 输出样例#1: 7.41 dfs 屠龙宝刀点击就送 #includ

洛古——P1433 吃奶酪

https://www.luogu.org/problem/show?pid=1433 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块奶酪的坐标. 两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 输出格式: 一个数,表示要跑的最少距离,保留2位小数. 输入输出样例 输入样例#1: 4 1 1 1 -1

洛谷OJ P1433 吃奶酪 解题报告

洛谷OJ P1433 吃奶酪 解题报告 by MedalPluS 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入描述 第一行一个数n  (n<=15)接下来每行2个实数,表示第i块奶酪的坐标.两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 输出描述 一个数,表示要跑的最少距离,保留2位小数. 分析 这题很明显就是一个搜索题,枚举一下1_n的全排列,然后从0开始,按照排列一个一个算,时间

解题报告:luogu P1433 吃奶酪

题目链接:P1433 吃奶酪 我感觉可以改成:[模板]TSP问题(商旅问题) 了. 爆搜\(T\)一个点,考虑状压\(dp\)(还是爆搜). 我们用\(dp[i][j]\)表示现在是\(i\)状态,站在了\(j\)点. 那什么是状态呢? 我们用一个零一串表示每一点有无被走过(\(0\)是没走过,\(1\)是已走过),那么转移方程就是: \[dp[i][j]=min(dp[i][j],dp[i\&((1<<n)-1-(1<<(j-1)))][k]+dis[j][k])\] 好

洛谷OJ 1433 吃奶酪 暴力dfs(最优性cut)

https://www.luogu.org/problem/show?pid=1433 题意:起点为(0,0) 有n个点 求出起点出发经过n个点的最小距离//15个点 暴力 + 最优性cut(sum+还剩的点*最小距离>=ans 则stop) 水过... #include <bits/stdc++.h> using namespace std; typedef pair<int,double> pii; const int N=2e3+20; const double inf

洛谷 P2089 烤鸡【DFS递归/10重枚举】

[链接]:https://www.luogu.org/problemnew/show/P2089 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末.孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和 现在,Hanke想要知道,如果给你一个美味程度,请输出这10种配料的所有搭配方案 输入输出格式 输入格式: 一行,n<=5000 输出格式: 第一行,方案总数 第二行至结束,10个数,表示每种配料所放的

P1433 吃奶酪 回溯法

题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块奶酪的坐标. 两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 输出格式: 一个数,表示要跑的最少距离,保留2位小数. 输入输出样例 输入样例#1: 复制 4 1 1 1 -1 -1 1 -1 -1 输出样例#1: 复制 7.41 一开始回溯法显然超时然后加了

luogu P1433 吃奶酪

原题链接:https://www.luogu.org/problem/show?pid=1433 虽然是一道思维难度不大的DFS,但是这其中比较重要的是可行性剪枝(这是本蒟蒻做的第一道剪枝) 本题的优化点有不少:预处理两点之间的距离,用邻接矩阵存储,搜索时直接调用即可. 当目前走到的距离已经超过现有的最小值,那么就无需继续搜索下去,直接返回即可. (那些register 之类的,都是因为写了个死循环TLE了以为常数问题加的...) #include<cstdio> #include<cm

P1433 吃奶酪

题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块奶酪的坐标. 两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 输出格式: 一个数,表示要跑的最少距离,保留2位小数. 输入输出样例 输入样例#1: 4 1 1 1 -1 -1 1 -1 -1 输出样例#1: 7.41 代码: #include"stda