列表

详情


NC223200. E图同构

描述

定义两张无向简单图 G,H 是同构的,当且仅当两者的点集 V_G,V_H 大小相同,且存在一个双射 ,满足若 G 中存在一条边 uv,则 H 中存在一条边

虽然图同构判定目前没有多项式复杂度算法,但图同构具有优美的性质,比如两张图顶点度数组成的可重集相同。

对于一张无向联通简单图 G 中的一个顶点 u,定义顶点 u 的度数 为 G 中以 u 为一个顶点的边数。考虑可重集 ,其中 表示图 G 中 u,v 之间的最短路长度,定义顶点 u 的度分布 ,注意这是列表而不是可重集。定义图 G 的*距离-度分布* 为可重集

例如下图的距离-度分布为


虽然距离-度分布是图同构的一个很强的性质,但若两个图满足距离-度分布相同,他们并不一定同构,例如下图,两者的二度点的度分布均为 ,三度点的度分布均为 ,但显然两张图不同构。


聪明的你可能意识到了问题所在,上面的两张图中存在很多度分布完全相同的点,这大大削弱了两张图距离-度分布相同的性质,现在菜菜的小 W 有一个猜想:若两张图 G,H 满足 且对于 G 中的任意两个节点 u,v 满足 ,H 中的任意两个节点 u,v 满足 ,那么 G,H 是同构的。

强强的小 X 一眼就看出了这个猜想是错误的,你想对于每一个 n 找到图节点数是 n 的反例。但由于距离-度分布相同确实是一个很强的性质,对于一部分 n 可能并没有对应的反例,你只需要报告无解即可。

输入描述

一行一个整数 

输出描述

第一行一个字符串 YES 或 NO,表示是否存在对应的反例。

若存在,第一行输出 YES,剩下的输出分成两部分,分别表示你构造的图 G 和 H,对于任意一部分:第一行一个正整数 m 表示图的边数,然后 m 行每行两个整数 u,v 表示一条 u,v 之间的边。

因为图是简单图,容易发现

你需要保证 G,H 都是连通图,且 G,H 不同构,,且 G,H 分别满足其中任意两个点 u,v

若不存在,输出一行 NO。

示例1

输入:

4

输出:

YES
4
1 2
2 3
1 3
1 4
4
1 3
2 3
1 4
2 4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 408K, 提交时间: 2021-09-17 20:20:17

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	if(n<=6){ cout<<"NO"; return 0;}
	cout<<"YES"<<endl;
	int m=11+n-7;
	cout<<m<<endl;
	cout<<"1 2\n2 3\n3 4\n4 5\n5 6\n6 7\n7 1\n";
	cout<<"1 3\n2 4\n2 7\n4 6\n";
	if(n>=8) cout<<"1 8\n";
	for( int i=9;i<=n;++i) cout<<i-1<<' '<<i<<endl;
	cout<<m<<endl;
	cout<<"1 2\n2 3\n3 4\n4 5\n5 6\n6 7\n7 1\n";
	cout<<"1 3\n2 4\n2 6\n4 7\n";
	if(n>=8) cout<<"1 8\n";
	for( int i=9;i<=n;++i) cout<<i-1<<' '<<i<<endl;
}

上一题