牛客2018多校一 Two Graphs (图 同构)

博客围绕牛客网题目展开,题目给出n个点,m1条边构成图1,m2条边构成图2,要求计算图1有多少子图与图2同构。题解指出先明确同构定义,即两图邻接矩阵相同,然后枚举图1所有子图,通过n个点全排列,判断边数并hash判重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://ac.nowcoder.com/acm/problem/17136
题意: 给 出 n 个 点 , m 1 条 边 表 示 图 1 , m 2 条 边 表 示 图 2 , 问 图 1 有 多 少 子 图 与 图 2 同 构 给出n个点,m1条边表示图1,m2条边表示图2,问图1有多少子图与图2同构 nm11m2212

题解: 首 先 明 白 同 构 的 定 义 : 当 两 图 同 构 时 , 对 应 点 相 同 , 对 应 边 相 同 , 即 两 图 的 邻 接 矩 阵 相 同 。 首先明白同构的定义:当两图同构时,对应点相同,对应边相同,即两图的邻接矩阵相同。

那 么 我 们 可 以 枚 举 图 1 的 所 有 子 图 , 即 n 个 点 的 全 排 列 , 判 断 边 数 是 否 相 同 , 然 后 h a s h 判 重 那么我们可以枚举图1的所有子图,即n个点的全排列,判断边数是否相同,然后hash判重 1nhash

#include<bits/stdc++.h>
using namespace std;
int n,m1,m2;
int e[10];
pair<int,int>p[105];
int mp[10][10];
set<unsigned long long>st;
int main(){
    while(cin>>n>>m1>>m2){
        st.clear();
        memset(mp,0,sizeof mp);
        for(int i = 1; i <= n; i++)
            e[i] = i;
        for(int i = 1,u,v; i <= m1; i++){
            cin>>u>>v;
            mp[u][v] = mp[v][u] = 1;
        }
        for(int i = 1; i <= m2; i++){
            cin>>p[i].first>>p[i].second;
        }
        do{
            unsigned long long base = 131,ha = 0,i;
            int cnt = 0;
            for(i = 1; i <= m2; i++){
                int fi = p[i].first,se = p[i].second;
                if(mp[e[fi]][e[se]] == 1){
                    cnt++;
                    ha = ha*base+i;
                }
            }
            if(cnt == m1){
                st.insert(ha);
            }
        }while(next_permutation(e+1,e+n+1));
        cout<<st.size()<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值