题意:给你两个图G1,G2,问你G2中有多少个子图与G1同构.
分析:
总共就8个点且是无向无环图,G2节点进行新的映射到C,全排列C就等价于全排列G2的每一条边,然后hash去重.
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
set<int> se;
const int mod = 1e9 + 7;
int vis[10][10], c[10];
struct node {
int a, b;
}s[60];
int main() {
int n, m1, m2;
while(scanf("%d %d %d", &n, &m1, &m2) != EOF) {
se.clear();
for(int i = 1; i <= n; ++i) c[i] = i;
memset(vis, 0, sizeof(vis));
int a, b;
for(int i = 0; i < m1; ++i) {
scanf("%d %d", &a, &b);
vis[a][b] = vis[b][a] = 1;
}
for(int i = 0; i < m2; ++i) {
scanf("%d %d", &s[i].a, &s[i].b);
}
do {
int ans = 0; LL sum = 0;
for(int i = 0; i < m2; ++i) {
if(vis[c[s[i].a]][c[s[i].b]]) {
ans++;
sum = (sum * 237 + i + 1) % mod; //+i防止每个图都一样
}
}
if(ans == m1) se.insert(sum);
} while(next_permutation(c + 1, c + n + 1));
printf("%d\n", se.size());
}
return 0;
}