#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<ctype.h>
#define N 100
#define max(x,y) x>y?x:y
#define min(x,y) x<y?x:y
#include<stdlib.h>
int G[N][N], H[N][N], v;//G H 记录邻接矩阵
int deg_G[N], deg_H[N];//分别记录 G H 的各顶点度数
int G_match_H[N];//G_match_H[i] = j 表示Gi与Hj配对
int flag[N];//标记H中的顶点是否配对
int cnt = 0;//同构数量
void func(int);//利用递归搜索
void examine(void);//判断配对是否满足同构条件
int main()
{
printf("请输入顶点数:");
scanf("%d", &v);
printf("请输入图G的邻接矩阵:\n");
int m1 = 0, m2 = 0, count;
for (int i = 1; i <= v; ++i)
{
count = 0;
for (int j = 1; j <= v; ++j)
{
scanf("%d", &G[i][j]);
m1 += G[i][j];
count += G[i][j];
}
deg_G[i] = count;
}
printf("请输入图H的邻接矩阵:\n");
for (int i = 1; i <= v; ++i)
{
count = 0;
for (int j = 1; j <= v; ++j)
{
scanf("%d", &H[i][j]);
m2 += H[i][j];
count += H[i][j];
}
deg_H[i] = count;
}
if (m1 != m2)//边数不同,直接排除
{
printf("图G与图H不同构!\n");
return 0;
}
else
{
func(1);
if (!cnt)printf("图G与图H不同构!\n");
return 0;
}
}
void examine(void)
{
for (int i = 1; i <= v; ++i)
for (int j = 1; j < i; ++j)
if (G[i][j] != H[G_match_H[i]][G_match_H[j]])return;
++cnt;
printf("\n存在同构:\n");
for (int i = 1; i <= v; ++i)
printf("G%d->H%d%c", i, G_match_H[i], (i % 5 == 0 ? '\n' : ' '));
printf("\n");
}
void func(int cur)
{
if (cur == v + 1)
{
examine();
return;
}
for (int i = 1; i <= v; ++i)
{
if (deg_G[cur] == deg_H[i] && flag[i] == 0)//跟度数相同且空闲的顶点配对
{
flag[i] = 1;
G_match_H[cur] = i;
func(cur + 1);
flag[i] = 0;
G_match_H[cur] = 0;
}
}
}
图同构算法
最新推荐文章于 2023-05-10 23:48:17 发布