FZU三月月赛A——BFS+TSP——小明的迷宫
2015-04-28 19:40
260 查看
Problem Description
小明误入迷宫,塞翁失马焉知非福,原来在迷宫中还藏着一些财宝,小明想获得所有的财宝并离开迷宫。因为小明还是学生,还有家庭作业要做,所以他想尽快获得所有财宝并离开迷宫。#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int n; struct edge{ int x; int y; }a[20]; int temp[20][1<<16],dis[20][20],best[1<<16]; const int inf = 0x3f3f3f3f; int main() { while(~scanf("%d",&n)){ for(int i = 0; i < n ; i++) scanf("%d%d",&a[i].x,&a[i].y); int len = 0; int maxn = (1<<n)-1; for(int i = 0 ; i < n ; i++) for(int j = 0; j <n ; j++) dis[j][i] = dis[i][j] = ceil(sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)));//dis记录的是各个点之间的距离 for(int i = 0 ; i <= maxn; i++) best[i]= inf; for(int i = 0 ; i <= n ; i++) for(int j = 0 ; j <= maxn; j++) temp[i][j] = inf; temp[0][1] = 0;//现在为状态1,当前位置在0的值 for(int i = 0 ; i <= maxn ; i++){ for(int j = 0 ; j < n ; j++){ if(i&(1<<j)){ for(int k = 0 ; k < n ; k++) if(!(i&(1<<k))) temp[k][i|(1<<k)] = min(temp[k][i|(1<<k)],temp[j][i]+dis[j][k]); } } } int ans = temp[0][maxn]; for(int i = 1; i < tot ; i++){ ans = min(ans ,temp[i][maxn] + dis[i][0]); printf("%d\n",ans); } return 0; }
View Code
相关文章推荐
- Fzu 2186 小明的迷宫【Bfs预处理+TSP状压dp】好题~
- (福大2015年3月月赛)FZU 2186 小明的迷宫 (BFS+状压DP)
- FZU 2186 小明的迷宫 (TSP)
- Fzu 2186 小明的迷宫(状态压缩dp + bfs)
- FZU - 1205 小鼠迷宫问题 (bfs+dfs)
- FZU 2186 小明迷宫寻宝 状压Dp
- (BFS,状压DP)小明的迷宫
- FZU 1205(小鼠迷宫问题)BFS+DFS的基本综合运用(同一题目中体现两种搜索方法的特点)
- bfs fzu 1205 小鼠迷宫
- FZU 1205 小鼠迷宫问题 <BFS+DFS>
- FZU三月月赛A——字符串处理——简单题
- FZU1205/SDUT1157_小鼠迷宫问题(DFS+BFS)
- FZU 2186 小明的迷宫
- FZU 2186 小明的迷宫 【压状dp】
- fzu三月月赛C题。AC's code
- nyoj 82 迷宫寻宝 【bfs】
- [BFS] Zjut CPP 1907 破解迷宫
- nyoj 82 迷宫寻宝(一) 【BFS】
- 地下迷宫(bfs)
- HDU 1728 逃离迷宫 转向限制BFS