博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018牛客多校第一场 D.Two Graphs
阅读量:5129 次
发布时间:2019-06-13

本文共 1308 字,大约阅读时间需要 4 分钟。

题意:

  n个点,m1条边的图E1,n个点,m2条边的图E2。求图E2有多少子图跟图E1同构。

题解:

  用STL的全排列函数next_permutation()枚举映射。对于每一种映射枚举每一条边判断合法性。

  总情况数要除以图E1的自同构数去重。

#include 
using namespace std;int n, m1, m2;int u, v, d;int ans;int p[10];int a[9][9], b[9][9];int main() { while(~scanf("%d%d%d", &n, &m1, &m2)) { d = ans = 0; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); for(int i = 1; i <= m1; i++) { scanf("%d%d", &u, &v); a[u][v] = a[v][u] = 1; } for(int i = 1; i <= m2; i++) { scanf("%d%d", &u, &v); b[u][v] = b[v][u] = 1; } for(int i = 1; i <= 8; i++) p[i] = i; // 图E1的自同构 do { int f = 1; for(int i = 1; f && i <= n; i++) for(int j = 1; f && j <= n; j++) if(a[i][j] && (!a[p[i]][p[j]])) f = 0; if(f) d++; } while(next_permutation(p+1, p+n+1)); // 图E2和E1的同构 do { int f = 1; for(int i = 1; f && i <= n; i++) for(int j = 1; f && j <= n; j++) if(a[i][j] && (!b[p[i]][p[j]])) f = 0; if(f) ans++; } while(next_permutation(p+1, p+n+1)); printf("%d\n", ans/d); }}
View Code

 

转载于:https://www.cnblogs.com/Pneuis/p/9338141.html

你可能感兴趣的文章
大家在做.NET B/S项目的时候多用什么设技术啊?
查看>>
Java SE和Java EE应用的性能调优
查看>>
Android设计模式系列--原型模式
查看>>
免费的论文查重网站
查看>>
C语言程序第一次作业
查看>>
leetcode-Sort List
查看>>
中文词频统计
查看>>
了解node.js
查看>>
想做移动开发,先看看别人怎么做
查看>>
Eclipse相关集锦
查看>>
虚拟化架构中小型机构通用虚拟化架构
查看>>
继承条款effecitve c++ 条款41-45
查看>>
Java泛型的基本使用
查看>>
1076 Wifi密码 (15 分)
查看>>
noip模拟赛 党
查看>>
bzoj2038 [2009国家集训队]小Z的袜子(hose)
查看>>
Java反射机制及其Class类浅析
查看>>
Postman-----如何导入和导出
查看>>
移动设备显示尺寸大全 CSS3媒体查询
查看>>
图片等比例缩放及图片上下剧中
查看>>