题目

给出一个 $n$,判断是否存在 $n$ 个顶点的自补图,如果存在,输出边和映射。

分析

一个无向图若同构于它的补图,则称该图为自补图。

定理:一个自补图一定存在 $4k$ 或 $4k+1$ 个顶点.

证:

原图的边数+补图的边数=完全图的边数=n(n-1)/2

由于原图与补图同构,所以边数相等,

所以,原图的边数=n(n-1)/4,

边数肯定为整数,所以 4|n 或者 4|(n+1).

现在的问题是如何构造呢?

先考虑 $n=4k$,将其分成两半,

一半连接成完全图,一半为独立的点,

这样边数还不够,再将左上和右下一一相连,右上和左下一一相连。

很容易发现其补图变形一下就跟它一样,然后找一下对应关系。

#include<bits/stdc++.h>
using namespace std; int n; int main()
{
int T, kase=;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
printf("Case #%d: ", ++kase);
if(n % == )
{
printf("Yes\n");
int k = n/;
for(int i = ; i<= k;i++)
{
for(int j = ; j <= *k;j++)
{
if(j == i) printf("");
else printf("");
}
for(int j = *k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("\n");
}
for(int i = k+;i <= *k;i++)
{
for(int j = ; j <= *k;j++)
{
if(j == i) printf("");
else printf("");
}
for(int j = *k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("\n");
}
for(int i = *k+;i <= *k;i++)
{
for(int j = ;j <= k;j++) printf("");
for(int j = k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("\n");
}
for(int i = *k+;i <= *k;i++)
{
for(int j = ;j <= k;j++) printf("");
for(int j = k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("\n");
}
for(int i = *k;i >= *k+;i--) printf("%d ", i);
for(int i = *k;i >= *k+;i--) printf("%d ", i);
for(int i = k;i >= ;i--) printf("%d ", i);
for(int i = *k;i >= k+;i--) printf("%d%c", i, i == k+? '\n':' ');
}
else if(n % == )
{
printf("Yes\n");
int k = n/;
for(int i = ; i<= k;i++)
{
for(int j = ; j <= *k;j++)
{
if(j == i) printf("");
else printf("");
}
for(int j = *k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("1\n");
}
for(int i = k+;i <= *k;i++)
{
for(int j = ; j <= *k;j++)
{
if(j == i) printf("");
else printf("");
}
for(int j = *k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("1\n");
}
for(int i = *k+;i <= *k;i++)
{
for(int j = ;j <= k;j++) printf("");
for(int j = k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("0\n");
}
for(int i = *k+;i <= *k;i++)
{
for(int j = ;j <= k;j++) printf("");
for(int j = k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("0\n");
}
for(int i = ;i <= *k;i++) printf("");
for(int i = *k+;i <= *k+;i++) printf("");
printf("\n"); for(int i = *k;i >= *k+;i--) printf("%d ", i);
for(int i = *k;i >= *k+;i--) printf("%d ", i);
for(int i = k;i >= ;i--) printf("%d ", i);
for(int i = *k;i >= k+;i--) printf("%d ", i);
printf("%d\n", *k+);
}
else
{
printf("No\n");
}
}
}

2019牛客多校E Androgynos——自补图&&构造的更多相关文章

  1. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  2. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  3. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  4. 2019牛客多校 Round4

    Solved:3 Rank:331 B xor 题意:5e4个集合 每个集合最多32个数 5e4个询问 询问l到r个集合是不是都有一个子集的xor和等于x 题解:在牛客多校第一场学了线性基 然后这个题 ...

  5. 2019牛客多校第一场E ABBA(DP)题解

    链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...

  6. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  7. 2019牛客多校第四场 A meeting

    链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...

  8. [2019牛客多校第二场][G. Polygons]

    题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...

  9. 2019 牛客多校第一场 D Parity of Tuples

    题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...

随机推荐

  1. 登陆Linux服务器时触发邮件提醒

    目前,客户只能在发现数据或者虚拟机被恶意侵入或者用户的误操作导致了数据的丢失之后,采取善后的手段,但是并没法做到提前的预警.那么通过 PAM 模块,就可以实现用户登录及获取root 权限时,通过邮件的 ...

  2. Jenkins+maven+gitlab自动化部署之基础环境部署(一)

    从一个二线城市,来到上海,刚入职,老大就给任务,为了减少开发打包部署时间,需要搭建一套自动化部署环境.接到任务后,赶紧上网查找资料,以及了解jenkins作用等等,用了一周时间,了解了个大概,由于都是 ...

  3. PAT甲级 并查集 相关题_C++题解

    并查集 PAT (Advanced Level) Practice 并查集 相关题 <算法笔记> 重点摘要 1034 Head of a Gang (30) 1107 Social Clu ...

  4. python学习-42 装饰器 --- 函数闭包1

    函数闭包举例: def father(name): print('hello world') def son(): print('儿子说:我的爸爸是%s' % name) def grandfson( ...

  5. element-ui 合并单元格的方法

    arraySpanMethod({ row, column, rowIndex, columnIndex }) { // 只合并区域位置          //columnIndex 横的第一列    ...

  6. 纯css实现移动端横向滑动列表&&overflow:atuo;隐藏滚动条

    <!DOCTYPE html> <html> <head> <title>横向滑动</title> <style type=" ...

  7. SAS学习笔记17 SAS生成随机数函数(rand function)

  8. Istio技术与实践03:最佳实践之sidecar自动注入

    Istio通过对serviceMesh中的每个pod注入sidecar,来实现无侵入式的服务治理能力.其中,sidecar的注入是其能力实现的重要一环(本文主要介绍在kubernetes集群中的注入方 ...

  9. hdu 1114需要装满的完全背包 重点是背包初始化的问题

    .,. 最近在看背包九讲 所以就刷了一下背包的题目 这道题目是一个典型的完全背包问题 而且要求满包 在这里 我就简单整理一下背包初始化问题吧 对于没有要求满包的问题 也就是背包可以不取满的问题 在背包 ...

  10. sudo pip3找不到命令

    转自: https://blog.csdn.net/Cryhelyxx/article/details/53384004 编辑/etc/sudoers 找到Defaults env_reset, 将其 ...