poj 2907 Collecting Beepers dfs

题意:已知起点s,求从s出发,依次到达n个点,然后再回到起点s所需的最短路径。

分析:dfs,从第一个点开始,枚举所有的边,遍历到头,当枚举完所有的点。

View Code
#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;
}

 

posted @ 2012-07-03 20:56  lenohoo  阅读(164)  评论(0编辑  收藏  举报