N个整数与K对数字有多少个不能相邻的排列?
How many permutations of N integers with K pairs of numbers that can't be adjacent?
有N个整数{1,2,…,N}和K个有序的数字对(A,B);A!=BA、 B<=N.没有一对是相同的(例如(2,4)不能输入一次以上)。同一元素可以成对出现。我必须写一个C++程序,用一个算法来求所有N个整数的排列数,其中任何一对中的B都不在它的a后面。注意,对(a,B)!=(B,A)。
示例:
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,所以我需要找到一个更有效的解决方案。
您可以创建一个包含所有数字的完整图,并删除与输入对对应的边。
在生成的图中,每个哈密尔顿路径对应于一个解。所以你需要一个算法来找到给定图中的哈密尔顿路径的个数。
不幸的是,没有一个时效性的解决方案。也就是说,你必须列举所有可能的路径来计数它们所以,简而言之,寻找计算哈密尔顿路径的算法
以下是一些讨论:
讨论这个确切问题的so线程
wolfram链路
根据输入对的数量,也许更容易计算出打破条件的解决方案的数量。你可以把它从可能性总数(n!)中减去,得到你想要的答案。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 数组长度,为什么从命令行获取时不能使用它?
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 为什么我不能将 rand() 与数组的大小一起使用?
- 为什么虚函数不能是静态的和全局的?
- 为什么我不能在 while 循环中创建线程?
- 为什么这个音频包络不能通过开关的情况?
- N个整数与K对数字有多少个不能相邻的排列?