题目链接:传送门
题目大意:给出两张图G1,G2,问G2有多少个子图与G1是同构的。
同构的定义:简要介绍
题目思路:
因为点的个数最多只有8个。
所以我们可以直接暴力枚举每一种情况。然后用状压 map判重即可。
ps:关于全排列 next_permutation() 函数的用法
#include<bits/stdc++.h>
using namespace std;
int mp1[10][10],mp2[10][10];
int a[10];
map<int,int> mp;
int main()
{
int n,m1,m2;
while(scanf("%d%d%d",&n,&m1,&m2) != EOF) {
for(int i = 1; i <= n; i++) a[i] = i;
mp.clear();
memset(mp1,0,sizeof(mp1));
memset(mp2,0,sizeof(mp2));
int x,y;
for(int i = 1; i <= m1; i++) {
scanf("%d%d",&x,&y);
mp1[x][y] = mp1[y][x] = 1;
}
for(int i = 1; i <= m2; i++) {
scanf("%d%d",&x,&y);
mp2[x][y] = mp2[y][x] = i;
}
int ans = 0;
do {
int flag = 1,b = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(mp1[i][j]) {
if(mp2[a[i]][a[j]] == 0) flag = 0;
else b |= 1 << mp2[a[i]][a[j]];
}
}
}
if(flag == 1 && mp[b] == 0) {
mp[b] = 1;
ans++;
}
}while(next_permutation(a + 1,a + 1 + n));
printf("%d\n",ans);
}
return 0;
}