HDU3414:Tour Route(竞赛图 + 哈密尔顿回路)

本文探讨了一个关于竞赛图的问题,即如何在一张完全由有向边连接的图中寻找一条哈密尔顿回路。文章提供了一种算法实现方案,包括通过遍历每个节点来构建哈密尔顿路径,并检查路径的起始节点和结束节点是否相连以形成回路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tour Route

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 759    Accepted Submission(s): 153
Special Judge


Problem Description
The city is so crowded that the mayor can't bear any longer. He issued an order to change all the roads into one-way street. The news is terrible for Jack, who is the director of a tourism company, because he has to change the travel route. All tourists want to set out from one scenic spot, then go to every scenic spots once and only once and finally return to the starting spot. They don’t care about which spot to start from, but they won’t go back to the starting spot before they have visited all other spots. Fortunately, the roads in the city have been perfectly built and any two scenic spots have been connected by ONE road directly. Jack gives the map of the city to you, and your task is to arrange a new travel route around the city which can satisfy the tourists.
 

Input
Input consists of multiple test cases and ends with a line of “0”.
For each test case:
The first line contains a single integer n (0<n<=1000), representing the number of city scenic spots. Scenic spots are numbered form 1 to n.
Then n lines follows, and each line consists of n integers. These n lines make a matrix. If the element in the ith row and the jth column is 1(i≠j), it means that the direction of the road between spot i and spot j is from spot i to spot j. If that element is 0, it means that the road’s direction is from spot j to spot i. The numbers in the main diagonal of the matrix are all 0. (i and j start from 1)
 

Output
For each test case, print all the spots No. according to the traveling order of the route in one line. If multiple routes exist, just print one of them. If no such route exists, print a “-1” instead. Because the starting spot is the same as the ending spot, so you don’t need to print the ending spot.

This problem needs special judge.
 

Sample Input

  
5 0 0 1 1 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 2 0 1 0 0 0
 

Sample Output

  
1 3 4 5 2 -1
 

Source
题意:给出一个n阶竞赛图(每对顶点间都有边相连的有向图),找出一个哈密尔顿回路(经过所有节点,且每个点只经过一次),没有就输出-1。

思路:竞赛图(n != 2)一定存在哈密尔顿路径,但回路就不一定了,需要遍历每个点,构建一次哈密尔顿路径,再判断首尾是否相连。

# include <iostream>
# include <cstdio>
# include <cstring>
# define maxn 1000
using namespace std;
int n, nex[maxn+3], map[maxn+3][maxn+3];
bool expend(int s)
{
    memset(nex, -1, sizeof(nex));
    int head = s, tail = s;
    for(int i=0; i<n; ++i)
    {
        if(i==s) continue;
        if(map[i][head])//直接插入。
        {
            nex[i] = head;
            head = i;
        }
        else//找到合适的位置插入。
        {
            int x = head, y = nex[head];
            while(y != -1 && map[y][i])
            {
                x = y;
                y = nex[y];
            }
            nex[x] = i;
            nex[i] = y;
            if(y == -1)
                tail = i;
        }
    }
    if(map[tail][head])
    {
        nex[tail] = head;
        return true;
    }
    return false;
}

bool solve()
{
    for(int i=0; i<n; ++i)
        if(expend(i))
            return true;
    return false;
}

int main()
{
    while(~scanf("%d",&n),n)
    {
        for(int i=0; i<n; ++i)
            for(int j=0; j<n; ++j)
                scanf("%d",&map[i][j]);
        if(n==1)
            puts("1");
        else if(n==2 || !solve())
            puts("-1");
        else
            for(int i=0,j=0; i<n; ++i, j=nex[j])
                printf("%d%c",j+1,i==n-1?'\n':' ');
    }
    return 0;
}


转载于:https://www.cnblogs.com/junior19/p/6729883.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值