给我一个基于c++的有关图的同构问题的代码,其中输入两个邻接矩阵,输出是否同构,里面涉及到顶点是否相同,顶点的度是否相同
时间: 2023-11-11 09:06:42 浏览: 87
以下是一个基于C++的有关图的同构问题的代码,其中输入两个邻接矩阵,输出是否同构,里面涉及到顶点是否相同,顶点的度是否相同。
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 105;
int n;
int a[MAXN][MAXN], b[MAXN][MAXN];
int dega[MAXN], degb[MAXN];
vector<int> va[MAXN], vb[MAXN];
bool check() {
for (int i = 1; i <= n; i++) {
if (dega[i] != degb[i] || va[i].size() != vb[i].size()) {
return false;
}
}
sort(dega + 1, dega + n + 1);
sort(degb + 1, degb + n + 1);
for (int i = 1; i <= n; i++) {
if (dega[i] != degb[i]) {
return false;
}
}
for (int i = 1; i <= n; i++) {
sort(va[i].begin(), va[i].end());
sort(vb[i].begin(), vb[i].end());
for (int j = 0; j < va[i].size(); j++) {
if (va[i][j] != vb[i][j]) {
return false;
}
}
}
return true;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
if (a[i][j]) {
va[i].push_back(j);
dega[i]++;
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> b[i][j];
if (b[i][j]) {
vb[i].push_back(j);
degb[i]++;
}
}
}
if (check()) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}
```
首先读入两个图的邻接矩阵,并且存储每个点的度数和相邻节点的编号。然后,对于每一个点,检查它们的度数是否相同,相邻节点的数量是否相同,以及它们相邻节点的编号是否相同。最后,判断两个图是否同构。
注意,这个算法并不是完美的,因为同构问题是一个 NP 问题,时间复杂度是指数级别的。这个算法仅适用于小规模的图。
阅读全文