2018牛客多校第一场 D.Two Graphs
2024-09-25 10:58:04
题意:
n个点,m1条边的图E1,n个点,m2条边的图E2。求图E2有多少子图跟图E1同构。
题解:
用STL的全排列函数next_permutation()枚举映射。对于每一种映射枚举每一条边判断合法性。
总情况数要除以图E1的自同构数去重。
#include <bits/stdc++.h>
using namespace std;
int n, m1, m2;
int u, v, d;
int ans;
int p[];
int a[][], b[][];
int main() {
while(~scanf("%d%d%d", &n, &m1, &m2)) {
d = ans = ;
memset(a, , sizeof(a));
memset(b, , sizeof(b));
for(int i = ; i <= m1; i++) {
scanf("%d%d", &u, &v);
a[u][v] = a[v][u] = ;
}
for(int i = ; i <= m2; i++) {
scanf("%d%d", &u, &v);
b[u][v] = b[v][u] = ;
}
for(int i = ; i <= ; i++) p[i] = i;
// 图E1的自同构
do {
int f = ;
for(int i = ; f && i <= n; i++)
for(int j = ; f && j <= n; j++)
if(a[i][j] && (!a[p[i]][p[j]])) f = ;
if(f) d++;
} while(next_permutation(p+, p+n+));
// 图E2和E1的同构
do {
int f = ;
for(int i = ; f && i <= n; i++)
for(int j = ; f && j <= n; j++)
if(a[i][j] && (!b[p[i]][p[j]])) f = ;
if(f) ans++;
} while(next_permutation(p+, p+n+));
printf("%d\n", ans/d);
}
}
最新文章
- WPF做12306验证码点击效果
- SSL安全证书-概念解析
- FineReport集成到AWS系统中的方案
- (01)javascript 数据类型
- java+tomcat(apr,native)
- spring+mybatis实现读写分离
- 在archlinux上搭建twitter storm cluster
- paper 69:Haar-like矩形遍历检测窗口演示Matlab源代码[转载]
- Java基础--继承方法调用顺序
- ibatis动态语句加and 和不加and
- 可以让PHP编程事半功倍的类库
- mybatis一对多,多对一
- 自学HTML的几个例子
- Common Lisp第三方库介绍 | (R "think-of-lisper" 'Albertlee)
- FZU 2168 防守阵地 I(前n项和的前n项和)
- 【Rsync项目实战】备份全网服务器数据
- Flask 学习 十二 用户评论
- zhifubao
- Fleck For Web Socket
- [数学杂志]AML