牛客网暑期ACM多校训练营(第一场)D Two Graphs(图)

题意

给两个图G1和G2,求G2的子图中与G1同构的数目。

分析

首先n=8,那么n!的算法问题不大。枚举G1的每个点,在G2中找同构的顶点序列。需要注意的是G1存在自同构的情况,所以对G1本身进行一次枚举,最后除去这部分就是正确答案。

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define lc idx<<1
#define rc idx<<1|1
#define rson mid+1,r,rc
#define lson l,mid,lc
using namespace std;
typedef long long ll;
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = 1e9+7;
int T;
void testcase(){
    printf("Case %d: ",++T);
}
const int MAXN = 1e6+10;
const int MAXM = 30;


int g1[10][10],g2[10][10];
int ans,tmp;
int n,m1,m2;
int vis[10],ma[10];


void dfs(int u){
    if(u==n+1){
        ans++;
        return;
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            bool f=true;
            for(int j=1;j<=u;j++){
                if(g1[j][u]&&!g2[ma[j]][i]){
                    f=false;
                    break;
                }
            }
            if(f){
                vis[i]=1;
                ma[u]=i;
                dfs(u+1);
                vis[i]=0;
            }
        }
    }
}
void dfs1(int u){
    if(u==n+1){
        tmp++;
        return;
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            bool f=true;
            for(int j=1;j<=u;j++){
                if(g1[j][u]&&!g1[ma[j]][i]){
                    f=false;
                    break;
                }
            }
            if(f){
                vis[i]=1;
                ma[u]=i;
                dfs1(u+1);
                vis[i]=0;
            }
        }
    }
}
int main() {
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif // LOCAL
    int u,v;
    while(~scddd(n,m1,m2)){
        mset(g1,0);
        mset(g2,0);
        mset(vis,0);
        ans=0;
        for(int i=0;i<m1;i++){
            scdd(u,v);
            g1[u][v]=g1[v][u]=1;
        }
        for(int i=0;i<m2;i++){
            scdd(u,v);
            g2[u][v]=g2[v][u]=1;
        }

        dfs(1);
        mset(vis,0);
        tmp=0;
        dfs1(1);
//        cout<<tmp<<endl;
        printf("%d\n",ans/tmp);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/fht-litost/p/9345759.html
今日推荐