zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    except与besides
    think用法
    walk用法
    complain用法
    go through用法
    herd用法
    ridiculous用法
    it is the same as用法
    let us say用法
    1002 A+B for Polynomials (25 分)(模拟)
  • 原文地址:https://www.cnblogs.com/romaLzhih/p/9489835.html
Copyright © 2011-2022 走看看