#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; }给每一句写上注释
时间: 2024-01-13 07:03:24 浏览: 145
```
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 105; // 定义常量MAXN为105
int n; // n表示图中节点的个数
int g1[MAXN][MAXN], g2[MAXN][MAXN]; // 定义g1和g2两个二维数组表示两个图
bool vis[MAXN]; // 定义vis数组,用于记录某个节点是否被访问过
int ans[MAXN]; // 定义ans数组,记录每个节点的匹配结果
// 定义dfs函数,用于判断两个图是否同构,cur表示当前匹配到的节点
bool dfs(int cur) {
if (cur == n + 1) { // 如果当前节点已经匹配完毕,返回true
return true;
}
for (int i = 1; i <= n; i++) { // 遍历所有节点
if (!vis[i]) { // 如果该节点未被访问过
bool flag = true; // 定义标志位flag,记录当前节点与已匹配的节点是否匹配
for (int j = 1; j < cur; j++) { // 遍历已匹配的节点
if (g1[cur][j] != g2[i][ans[j]]) { // 如果当前节点与已匹配的节点不匹配
flag = false; // 将标志位设为false
break; // 跳出循环
}
}
if (flag) { // 如果当前节点与已匹配的节点都匹配
vis[i] = true; // 将该节点设为已访问
ans[cur] = i; // 将该节点匹配到当前节点上
if (dfs(cur + 1)) { // 继续匹配下一个节点
return true; // 如果匹配成功,返回true
}
vis[i] = false; // 如果匹配失败,将该节点标记为未访问
}
}
}
return false; // 如果遍历完所有节点都没有匹配成功,返回false
}
// 定义isomorphic函数,用于判断两个图是否同构
bool isomorphic() {
memset(vis, false, sizeof(vis)); // 初始化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; // 如果是,输出YES
} else {
cout << "NO" << endl; // 如果不是,输出NO
}
return 0;
}
```
阅读全文