牛客网ACM多校第一场 D Two Graphs(枚举加上map判重)

题目链接:传送门

题目大意:给出两张图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;
}

猜你喜欢

转载自blog.csdn.net/qq_36782366/article/details/81273124