博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Two Graphs 牛客网暑期ACM多校训练营(第一场)D 图论基础知识 全排列
阅读量:5743 次
发布时间:2019-06-18

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

链接:

来源:牛客网

Two undirected simple graphs
and
where
are isomorphic when there exists a bijection
on V satisfying
 if and only if {x, y} ∈ E
2.
Given two graphs
and
, count the number of graphs
satisfying the following condition:
*
.
* G
1 and G are isomorphic.

输入描述:

The input consists of several test cases and is terminated by end-of-file. The first line of each test case contains three integers n, m

1

and m

2

where |E

1

| = m

1

and |E

2

| = m

2

. The i-th of the following m

1

lines contains 2 integers a

i

and b

i

which denote {a

i

, b

i

} ∈ E

1

. The i-th of the last m

2

lines contains 2 integers a

i

and b

i

which denote {a

i

, b

i

} ∈ E

2

.

输出描述:

For each test case, print an integer which denotes the result.

示例1

输入

3 1 21 31 22 34 2 31 21 34 14 24 3

输出

23

备注:

* 1 ≤ n ≤ 8 *

* 1 ≤ a

i

, b

i

≤ n * The number of test cases does not exceed 50. 求图G1有多少个子图和图G2是同构图 枚举图G1的全排列子图,然后判断每一个子图是否和图G2是同构图 判断原理: 同构要求边,点以及点的结构都相同。 我们先存好图G1中每种边点结构的关系,用一个vis数组存下每条边 然后在全排列判断每个子图的时候判断这个子图是否和图G2同构,同构就用个set保存下这种情况(每种情况用散列哈希求出一个独一无二的值) 最后set的size就是结果
#include #include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define debug(a) cout << #a << " " << a << endlusing namespace std;const int maxn = 1e1;const int mod = 1e9 + 7;typedef long long ll;ll vis[maxn][maxn], f[maxn];pair
p[maxn*10];int main() { ll n, m1, m2; while( cin >> n >> m1 >> m2 ) { memset( vis, 0, sizeof(vis) ); for( ll i = 1; i <= n; i ++ ) { f[i] = i; } for( ll i = 1, a, b; i <= m1; i ++ ) { cin >> a >> b; vis[a][b] = vis[b][a] = 1; } for( ll i = 1; i <= m2; i ++ ) { cin >> p[i].first >> p[i].second; } set
s; do{ ll ha = 0, cnt = 0; for( ll i = 1; i <= m2; i ++ ) { if( vis[f[p[i].first]][f[p[i].second]] ) { //判断边点结构 ha = ha*133 + i; //散列求点,确保每种情况得到的点不一样 ha %= mod; cnt ++; //判断边 } } if( cnt == m1 ) { s.insert(ha); } } while( next_permutation(f+1,f+n+1) ); //全排列图G1 cout << s.size() << endl; } return 0;}

  

转载于:https://www.cnblogs.com/l609929321/p/9338520.html

你可能感兴趣的文章
MFC多线程的创建,包括工作线程和用户界面线程
查看>>
我的友情链接
查看>>
FreeNAS8 ISCSI target & initiator for linux/windows
查看>>
cvs文件提交冲突解决方案
查看>>
PostgreSQL数据库集群初始化
查看>>
++重载
查看>>
Rainbond 5.0.4版本发布-做最好用的云应用操作系统
查看>>
nodejs 完成mqtt服务端
查看>>
在ASP.NET MVC 中获取当前URL、controller、action
查看>>
Spring IoC容器初的初始化过程
查看>>
sql server 触发器
查看>>
[工具]前端自动化工具grunt+bower+yoman
查看>>
自动化测试之WatiN(2)
查看>>
关于完成生鲜电商项目后的一点总结
查看>>
noip2012 普及组
查看>>
第二阶段 铁大Facebook——十天冲刺(10)
查看>>
Java判断是否为垃圾_Java GC如何判断对象是否为垃圾
查看>>
多项式前k项和java_多项式朴素贝叶斯softmax改变
查看>>
java数组只能交换0下标和n_编程练习-只用0交换排序数组
查看>>
centos7安装mysql视频教程_centos7安装mysql(完整)
查看>>