CF1481D AB Graph 题解

【思路】

首先有几个显而易见的东西。

  1. 如果存在两个点,他们之间的两条边字母相同,那么一定有解(在两个点之间跳。)

  2. 否则,这张图的邻接矩阵一定长成这样:

    * a b a
    b * a b
    a b * a
    b a b *

    沿着中间的斜线看,左右两边完全相反。

然后找这种图的特点。

  • 如果 $ n=2 $

    • 如果 $ m $ 是奇数,有解。

    • 如果 $ m $ 是偶数,无解。

  • 如果 $ n=3 $,必然有解,证明放在最后。

所以说,对于所有 $ n \ge 3 $,我们直接选择前三个点即可。

【代码】

#include <bits/stdc++.h>
using namespace std; char a[1005][1005];
int T,n,m; int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
getchar();
for(int j=1;j<=n;j++){
scanf("%c",&a[i][j]);
}
} //如果存在两个点,他们之间的两条边字母相同,那么一定有解(在两个点之间跳。)
bool flag_equ=false;
int flag1=0,flag2=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(a[i][j]==a[j][i]){
flag_equ=true;
flag1=i;
flag2=j;
break;
}
}
}
if(flag_equ==true){
puts("YES");
for(int i=1;i<=m+1;i++){
printf("%d ",i&1?flag1:flag2);
}puts("");
}else{ //如果 n=2
if(n==2){
if(m&1){
puts("YES");
for(int i=1;i<=m+1;i++){
printf("%d ",i&1?1:2);
}puts("");
}else{
puts("NO");
}
}else{
//如果 n>=3,必然有解。选择前三个点。
//如果 1 -> 2 -> 3 -> 1 相等,那么直接输出
if(a[1][2]==a[2][3] and a[2][3]==a[3][1]){
puts("YES");
for(int i=1;i<=m+1;i++){
printf("%d ",(i-1)%3+1);
}puts("");
}else{
puts("YES");
//定位3个点.
//P1 有两个a的出度,两个b的入度
int P1;
if(a[1][2]==a[1][3] and a[1][3]=='a' and a[2][1]==a[3][1] and a[3][1]=='b') P1=1;
if(a[2][1]==a[2][3] and a[2][3]=='a' and a[1][2]==a[3][2] and a[3][2]=='b') P1=2;
if(a[3][1]==a[3][2] and a[3][2]=='a' and a[1][3]==a[2][3] and a[2][3]=='b') P1=3; //P2 有两个b的出度,两个a的入度
int P2;
if(a[1][2]==a[1][3] and a[1][3]=='b' and a[2][1]==a[3][1] and a[3][1]=='a') P2=1;
if(a[2][1]==a[2][3] and a[2][3]=='b' and a[1][2]==a[3][2] and a[3][2]=='a') P2=2;
if(a[3][1]==a[3][2] and a[3][2]=='b' and a[1][3]==a[2][3] and a[2][3]=='a') P2=3; //P3 是剩下那一个点,入度出度都为一a一b
int P3;
P3=6-P1-P2; if(m&1){ //如果 m 是奇数,那么不停跳 ab/ba 即可
for(int i=1;i<=m+1;i++){
printf("%d ",i&1?P1:P2);
}puts("");
}else if(m%4==0){ //如果 m 可以被 4 整除,那么不停跳 abba/baab 即可
for(int i=1;i<=m+1;i++){
if(i%4==1) printf("%d ",P3);
if(i%4==2) printf("%d ",P2);
if(i%4==3) printf("%d ",P3);
if(i%4==0) printf("%d ",P1);
}puts("");
}else{ //如果 m 不能被 4 整除,但是可以被 2 整除,那么先跳一个 a/b,再不停跳 abba/baab,最后再跳一个 a/b 即可
printf("%d ",P1);
for(int i=2;i<=m;i++){
if((i-1)%4==1) printf("%d ",P3);
if((i-1)%4==2) printf("%d ",P2);
if((i-1)%4==3) printf("%d ",P3);
if((i-1)%4==0) printf("%d ",P1);
}printf("%d ",P2);
puts("");
}
}
}
} }
return 0;
}

【证明】

对于 $ n=3 $ 的情况下,必然有解。

  1. 假设邻接矩阵是下面这几种情况:

       * a b   |   * b a
    b * a | a * b
    a b * | b a *

    那么只要不停地跳 $ a/b $ 即可,输出为 1 2 3 1 2 3 1 2 3 ...

  2. 假设邻接矩阵是下面这几种情况:

       * a a   |   * b b
    b * b | a * a
    b a * | a b *
    • 如果 $ m $ 是奇数,那么不停跳 $ ab/ba $ 即可,输出为 1 2 1 2 1 2 ...

    • 如果 $ m $ 被 $ 4 $ 整除,那么不停跳 $ abba/baab $ 即可,输出为 2 3 2 1 2 3 2 1 2 3 2 1 2...

    • 如果 $ m $ 不能被 $ 4 $ 整除,但是可以被 $ 2 $ 整除,那么先跳一个 $ a/b $,再不停跳 $ abba/baab $,最后再跳一个 $ a/b $ 即可,输出为 1 2 3 2 1 2 3 2 1 2 3 2 1 2...3 2 1 2 3

  3. 假设邻接矩阵是下面这几种情况:

       * a a   |   * b b   |   * a b   |   * b a
    b * a | a * b | b * b | b * a
    b b * | a a * | a a * | b a *

    套路和上边的一样,可以自己画图看看。

CF1481D AB Graph 题解的更多相关文章

  1. [CF1481D] AB Graph(构造)

    题解 给一个 n \tt n n 个点的完全有向图, ( u , v ) \tt(u,v) (u,v) 或者 ( v , u ) \tt(v,u) (v,u) 都有一条边,前提是 u ≠ v \tt ...

  2. URAL2127 Determinant of a Graph 题解

    这个题真的折磨了我超久的.全网几乎搜不到一个详细的题解,俺来写写吧. 题意:给你一个无自环无重边的连通无向图,求它邻接矩阵的行列式的值. \(n\le 2*10^5,n-1\le m \le n+50 ...

  3. POJ 1737 Connected Graph 题解(未完成)

    Connected Graph Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3156   Accepted: 1533 D ...

  4. CF1581B Diameter of Graph 题解

    Content \(\textsf{CQXYM}\) 想要构造一个包含 \(n\) 个点和 \(m\) 条边的无向连通图,并且他希望这个图满足下列条件: 该图中不存在重边和自环.也就是说,一条边应该连 ...

  5. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  6. [Leetcode Week3]Clone Graph

    Clone Graph题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/clone-graph/description/ Description Clon ...

  7. 【Lintcode】137.Clone Graph

    题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...

  8. CodeForces 715B Complete The Graph 特殊的dijkstra

    Complete The Graph 题解: 比较特殊的dij的题目. dis[x][y] 代表的是用了x条特殊边, y点的距离是多少. 然后我们通过dij更新dis数组. 然后在跑的时候,把特殊边都 ...

  9. 算法与数据结构基础 - 图(Graph)

    图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...

  10. ACM - 最短路 - CodeForces 295B Greg and Graph

    CodeForces 295B Greg and Graph 题解 \(Floyd\) 算法是一种基于动态规划的算法,以此题为例介绍最短路算法中的 \(Floyd\) 算法. 我们考虑给定一个图,要找 ...

随机推荐

  1. HDU 2056:Rectangles(两个矩形交点的性质)

    一.原题链接 Problem - 2056 (hdu.edu.cn) 二.题面 Given two rectangles and the coordinates of two points on th ...

  2. C++红黑树的实现

    最近闲来无事,一直没有研究过红黑树,B树,B+树之类的,打算自己用C语言实现一下它们. 红黑树的性质定义: 节点只能是黑色或者红色. 根节点必须是黑色. 每个叶子节点是黑色节点(称之为NIL节点,又被 ...

  3. 使用Servlet实现文件下载

    一位朋友最近在学习JavaWeb开发,开始学习文件下载操作,他自己尝试着去网上看一些教程,总的来说也不是太了解,就让我和他说说,如何实现文件下载功能.我和他说了一下大致的思路,主要分为前端和后端两部分 ...

  4. 07.Android之多媒体问题

    目录介绍 7.0.0.1 加载bitmap图片的时候需要注意什么?为何bitmap容易造成OOM?如何计算Bitmap占用内存? 7.0.0.2 如何理解recycle释放内存问题?图片加载到内存其实 ...

  5. Python 变换单词顺序组成新的一句话

    需求描述: 现在给出几个单词需要不断变换单词的顺序组成新的一句话 import itertools import pandas as pd # 定义项目列表 items = ['dog', 'appl ...

  6. TorchV的RAG实践分享(三):解析llama_index的数据存储结构和召回策略过程

    1.前言 LlamaIndex是一个基于LLM的数据处理框架,在RAG领域非常流行,简单的几行代码就能实现本地的文件的对话功能,对开发者提供了极致的封装,开箱即用. 本文以官方提供的最简单的代理示例为 ...

  7. python pyzbar 批量识别二维码

    1.安装pyzbar pip install pyzbar 2.代码 import os import cv2 as cv from pyzbar import pyzbar # 目录路径 path ...

  8. docker下载mongodb镜像并启动容器

    1.查找mongodb相关镜像 docker search mongo 找到相关的镜像进行拉取,如果不指定版本,默认下载最新的mongoDB.建议自己先查找需要那个版本后在进行拉取,因为mongoDB ...

  9. Involution:空间不共享?可完全替代卷积的高性能算子 | CVPR 2021

    其实这篇文章很早就写好了,但作者其它论文涉及到洗稿问题,所以先放着了.目前看这篇文章没被举报有洗稿的嫌疑,所以就发出来了 . 来源:晓飞的算法工程笔记 公众号 论文: Involution: Inve ...

  10. .NET分布式Orleans - 8 - 贪吃蛇项目实战(准备阶段)

    到目前为止,Orleans7的核心概念基本已经学完,我准备使用Orleans7做一个项目实战,来总结自己的学习效果. 项目效果 通过Orleans7来完成一个贪吃蛇游戏,要求如下: 可以多人在线玩 贪 ...