【问题标题】:How many permutations of N integers with K pairs of numbers that can't be adjacent?N 个整数与 K 对不能相邻的数字有多少个排列?
【发布时间】:2014-10-11 16:54:16
【问题描述】:

有N个整数{1, 2, ..., N}和K个有序数对(A, B);一个!= B; A, B

例子:

n = 5
k = 4
k1: (2, 3)
k2: (1, 4)
k3: (3, 2)
k4: (2, 4)

This perm. is OK: 4 1 3 5 2
This is not OK: 3 1 4 2 5

这是我的蛮力解决方案,递归检查每一种可能性:

#include <iostream>
using namespace std;

int n;
bool conflict[1000][1000];
bool visited[1000];
int result = 0;
int currentlength = 0;

void count(int a) {
    visited[a] = true;
    currentlength++;
    if (currentlength == n) {
        result++;
        visited[a] = false;
        currentlength--;
        return;
    }
    for (int i = 1; i <= n; i++) {
        if (!visited[i] && !conflict[a][i]) {
            count(i);
        }
    }
    visited[a] = false;
    currentlength--;
}

int main()
{
    int k;
    cin >> n >> k;
    for (int i = 0; i < k; i++) {
        int a, b;
        cin >> a >> b;
        conflict[a][b] = 1;
    }
    for (int i = 1; i <= n; i++) {
        count(i);
    }
    cout << result << endl;
    return 0;
}

N 和 K 分别上升到 1000000 和 100000,所以我需要找到更有效的解决方案。

【问题讨论】:

  • pairs是否可以重叠,例如k1 = (2,3), k2 = (2,4) ?
  • 当您说没有相同的对时,您的意思是不可能同时拥有对 (1,2) 和对 (1,3),因为 1 在两个对中? (或者您只是说 (1,2) 对不能在列表中出现两次?)
  • 鉴于 A=1 和 B=4,我可以理解为什么“1 4” OK。但是为什么“4 1”可以呢?好像B在我旁边。也许您的意思是说 B 不能立即跟随 A。
  • 已编辑。对可以重叠,同一对不能以相同顺序出现两次,B不能跟在A后面,但是A可以跟在B后面,除非有(B,A)。

标签: c++ algorithm permutation combinatorics


【解决方案1】:

您可以创建一个包含所有数字的完整图,并删除与输入对对应的边。

在结果图中,每个hamiltonian path 对应一个解决方案。因此,您需要一种算法来查找给定图中的哈密顿路径数。

不幸的是,没有时间有效的解决方案。也就是说,您必须枚举所有可能的路径来计算它们。 因此,简而言之,寻找计算哈密顿路径的算法。

这里有一些讨论:

A so thread that discusses this exact problem

wolfram link


根据输入对的数量,可能更容易计算破坏条件的解决方案的数量。您可以从可能性总数 (n!) 中减去它以获得您想要的答案。

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 2012-05-05
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    相关资源
    最近更新 更多