`
fuerbosi
  • 浏览: 465826 次
文章分类
社区版块
存档分类
最新评论

uva 539 - The Settlers of Catan

 
阅读更多

点击打开链接


题目意思:给定n个节点,编号为0--n-1,在给定m条边,要求一条最长的路径


解题思路 回溯搜索每一点的最长的路径


代码:


//求解最长的路径长度,给个的是一个无向的图,那么我们可以用回溯法去做,只要去试探每一个点的最长的路径,然后得到最大的即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <list>
#include <vector>
#include <stack>
#include <cmath>
#include <algorithm>
#define eps 1e-8
using namespace std;
const int MAXN = 30;

int n, m, ans, tans;
int G[MAXN][MAXN];//存储地图
int vis[MAXN];//标记节点是否被走过

//搜索
int dfs(int pos , int max) {
    if(max > tans)//更新临时的tans
        tans = max;
    for (int i = 0; i < n; i++) {
        if (G[pos][i]) {
            --G[pos][i];//无向图每一条边只能走一次
            --G[i][pos];
            vis[pos] = 1;//标记节点被走过
            dfs(i , max+1);
            ++G[pos][i];//状态的回溯
            ++G[i][pos];
            vis[pos] = 0;
        }
    }
    return tans;//返回该点能走的最大值
}

void solve(){
    int i , j;
    int temp;
    for(i = 0 ; i < n ; i++){
        for(j = 0 ; j < n ; j++){
            if(G[i][j]){//遍历每一个点
                tans = 0;//初始化为0
                temp = dfs(i , 0);
                if(ans < temp)//更新最大的值
                    ans = temp;
            }
        }
    }  
}

//主函数
int main() {
    int x, y;
    while (scanf("%d%d%*c", &n, &m) && n && m) {
        memset(G, 0, sizeof (G));
        for (int i = 0; i < m; i++) {
            scanf("%d%d", &x, &y);
            G[x][y] = 1;//因为每一条边只能走一次,所以标记为1即可
            G[y][x] = 1;
        }
        ans = 0;
        solve();
        printf("%d\n", ans);
    }
    return 0;
} 


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics