码迷,mamicode.com
首页 > 其他好文 > 详细

HDU3414 Tour Route(竞赛图寻找哈密顿回路)

时间:2016-05-04 20:50:48      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3414

题意:

  某个城市有N个景点,某一天来了一批游客想参观这些景点,他们的要求是这些景点都要去且每个景点仅去一次.特殊的是,对于任意两个景点,路都是单向的.即要么能从A景点到B景点,要么可以从B景点到A景点,不存在双向或者不连通的情况.让你找到一个回路,从某个景点出发,经过全部景点一次且仅一次,最后又能回到起点.

思路:

  很显然是让在竞赛图中寻找哈密顿回路,但是由于竞赛图一定存在哈密顿路径,但不一定存在哈密顿回路,所以需要枚举所有起点,构造一个哈密顿路径,然后判断起点和终点是否连通就可以了.

代码:

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>

using namespace std;
typedef long long LL;
const int maxN = 1000;

inline void read(int&a){char c;while(!(((c=getchar())>=0)&&(c<=9)));a=c-0;while(((c=getchar())>=0)&&(c<=9))(a*=10)+=c-0;}


void Hamilton(int ans[maxN + 7], int map[maxN + 7][maxN + 7], int n, int st){
    int nxt[maxN + 7];
    memset(nxt, -1, sizeof(nxt));
    int head = st;
    for(int i = 1; i <= n; i++){
        if(i == st)continue;
        if(map[i][head]){
            nxt[i] = head;
            head = i;
        }else{
            int pre = head, pos = nxt[head];
            while(pos != -1 && !map[i][pos]){
                pre = pos;
                pos = nxt[pre];
            }
            nxt[pre] = i;
            nxt[i] = pos;
        }
    }
    int cnt = 0;
    for(int i = head; i != -1; i = nxt[i])
        ans[++cnt] = i;
}

int main()
{
    //freopen("input.txt", "r", stdin);
    int N;
    while(~scanf("%d", &N) && N){
        int map[maxN + 7][maxN + 7] = {0};
        for(int i = 1; i <= N; i++){
            for(int j = 1; j <= N; j++){
                int u;
                read(u);
                map[i][j] = u;
            }
        }
        if(N == 1){printf("1\n");continue;}
        int ans[maxN + 7] = {0}, i;
        for(i = 1; i<= N; i++){
            Hamilton(ans, map, N, i);
            if(map[ans[N]][ans[1]]){
                for(int j = 1; j <= N; j++){
                    printf(j == 1 ? "%d":" %d", ans[j]);
                }
                break;
            }
        }
        if(i > N)printf("-1");
        printf("\n");
    }
    return 0;
}

 

HDU3414 Tour Route(竞赛图寻找哈密顿回路)

标签:

原文地址:http://www.cnblogs.com/Ash-ly/p/5459540.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!