离散数学输入两个图的邻接矩阵判断两图同构的c++程序
时间: 2023-08-06 22:01:47 浏览: 90
图的邻接矩阵的实现原理
这是一个经典的问题,涉及到图同构的算法。下面给出一个基于回溯思想的C++程序:
```cpp
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 105;
int n;
int g1[MAXN][MAXN], g2[MAXN][MAXN];
bool vis[MAXN];
int ans[MAXN];
bool dfs(int cur) {
if (cur == n + 1) {
return true;
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
bool flag = true;
for (int j = 1; j < cur; j++) {
if (g1[cur][j] != g2[i][ans[j]]) {
flag = false;
break;
}
}
if (flag) {
vis[i] = true;
ans[cur] = i;
if (dfs(cur + 1)) {
return true;
}
vis[i] = false;
}
}
}
return false;
}
bool isomorphic() {
memset(vis, false, sizeof(vis));
return dfs(1);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> g1[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> g2[i][j];
}
}
if (isomorphic()) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}
```
该程序的基本思路是:从第一个节点开始,枚举第二个图中的所有节点,判断是否与当前节点匹配;如果匹配,则继续往下匹配;否则回溯到上一个节点,重新选择。这个过程中需要注意的一些细节:
1. 用 `vis` 数组记录哪些节点已经被使用过;
2. 用 `ans` 数组记录每个节点在第二个图中的编号;
3. 在回溯时需要撤销对节点的标记。
阅读全文