POJ1776(哈密顿路径)

题目:
http://poj.org/problem?id=1776

题意:
给出一个n*n的矩阵,若第i个任务做完之后可以做第j个任务,则矩阵的第i行第j列为1,否则为0。机器完成一项任务之后会自动转到下一个任务,否则机器会自动停止。
求出最少的启动次数,输出每次启动次数完成的任务个数和任务序列。

思路:

题目给出一个竞赛图(即任意两点之间有且仅有一条有向边的有向图),则竞赛图一定存在哈密顿路径。题目转化为求一条哈密顿路径。

#include <cstdio>  
#include <string.h>  
using namespace std;

const int inf = 0x3ffffffff;
const int maxn = 1005;
int n, head, t, g[maxn][maxn], ans[maxn];
char s[maxn][maxn];

void Hamliton(){ 
    memset(ans, -1, sizeof(ans));
    head = 1;
    for (int i = 2; i <= n; ++i) {
        bool flag = 0;
        for (int j = head; ~j; j = ans[j]) {
            if (g[i][j]) {
                if (j == head) head = i;
                else ans[t] = i;
                ans[i] = j;
                flag = 1;
                break;
            }
            else t = j;
        }
        if (!flag) ans[t] = i;
    }
}

int main()
{
    scanf("%d
", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%s", s[i]);
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (s[i][j] == '+')
                g[i][j + 1] = 1;
        }
    }
    Hamliton();
    printf("YES
");
    for (int i = head; ~i; i = ans[i]) {
        printf("%d", i-1);
        printf(" ");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/romaLzhih/p/9489835.html