Two Graphs (牛客)

该博客讨论了如何计算两个无向简单图G1和G2在满足特定条件下的同构情况数量。当图G的边集E包含在E2中,并且G与G1同构时,任务是找出这样的图G的数量。由于顶点数量限制在1到8之间,博主建议使用next_permutation进行全排列搜索,并强调了在处理映射重复时的去重策略,包括使用哈希集合(set)存储独特同构或计算重复计数并除以该次数。
摘要由CSDN通过智能技术生成

题目:
Two undirected simple graphs G1=⟨V,E1⟩ and G2=⟨V,E2⟩ where V={1,2,…,n} are isomorphic when there exists a bijection ϕ on V satisfying {ϕ(x),ϕ(y)}∈E1 if and only if {x, y} ∈ E2.Given two graphs G1=⟨V,E1⟩ and G2=⟨V,E2⟩, count the number of graphs G=⟨V,E⟩ satisfying the following condition:

  • E⊆E2.
  • G1 and G are isomorphic.
  • 1 ≤ n ≤ 8

大意: 求一个图通过映射,在另一个图有多少种同构情况
思路: 因为最多只有八个点,所以用next_permutation搜索各种映射情况
需要注意的是不同种的映射有可能是同一种情况,所以要注意去重
去重的方法有,一种就是就哈希,用set把每一种同构情况存储下来
另一种就是我们可以遍历到各种所有映射情况,求出一种同构体会被算重复多少次,最后的次数/重复次数就是所得
哈希,注意给边编号

#include<bits/stdc++.h>
using namespace std;
int a[10];
int mp1[10][10],mp2[10][10];
set<int>vis;
int main()
{
   
	int n,m1,m2;
	while(~scanf("%d%d%d",&n,&m1,&m2))
	{
   
		memset(mp1,0,sizeof mp1);
		memset(mp2,0,sizeof mp2);
		vis.clear();
		for(int i=1;i<=m1;i++)
		{
   
			int u,v;
			scanf("%d%d",&u,&v);
			mp1[u][v]=mp1[v][u]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值