poj 2907 Collecting Beepers dfs
题意:已知起点s,求从s出发,依次到达n个点,然后再回到起点s所需的最短路径。
分析:dfs,从第一个点开始,枚举所有的边,遍历到头,当枚举完所有的点。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <cstdlib> using namespace std; int x[500] , y[500]; bool vis[500]; int n; int GetDis(int a, int b) { return abs(x[a] - x[b]) + abs(y[a] - y[b]); } int ans; void dfs(int dep , int dist, int u) { if(dist > ans) return; if(dep == n) { int dis = GetDis(0 , u); if(dist + dis < ans) ans = dist + dis; return; } for(int i=1;i<=n;i++) { if(vis[i]) continue; vis[i] = true; int dis = GetDis(u , i); dfs(dep + 1 , dist + dis , i); vis[i] = false; } } int main() { int T , R , C; scanf("%d",&T); while(T--) { scanf("%d%d",&R, &C); scanf("%d%d",&x[0],&y[0]); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); ans = (1<<29); dfs(0 , 0 , 0); printf("The shortest path has length %d\n",ans); } return 0; }