CF1481D AB Graph 题解
CF1481D AB Graph 题解
【思路】
首先有几个显而易见的东西。
如果存在两个点,他们之间的两条边字母相同,那么一定有解(在两个点之间跳。)
否则,这张图的邻接矩阵一定长成这样:
* 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 $ 的情况下,必然有解。
假设邻接矩阵是下面这几种情况:
* a b | * b a
b * a | a * b
a b * | b a *
那么只要不停地跳 $ a/b $ 即可,输出为
1 2 3 1 2 3 1 2 3 ...假设邻接矩阵是下面这几种情况:
* 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
假设邻接矩阵是下面这几种情况:
* 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 题解的更多相关文章
- [CF1481D] AB Graph(构造)
题解 给一个 n \tt n n 个点的完全有向图, ( u , v ) \tt(u,v) (u,v) 或者 ( v , u ) \tt(v,u) (v,u) 都有一条边,前提是 u ≠ v \tt ...
- URAL2127 Determinant of a Graph 题解
这个题真的折磨了我超久的.全网几乎搜不到一个详细的题解,俺来写写吧. 题意:给你一个无自环无重边的连通无向图,求它邻接矩阵的行列式的值. \(n\le 2*10^5,n-1\le m \le n+50 ...
- POJ 1737 Connected Graph 题解(未完成)
Connected Graph Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3156 Accepted: 1533 D ...
- CF1581B Diameter of Graph 题解
Content \(\textsf{CQXYM}\) 想要构造一个包含 \(n\) 个点和 \(m\) 条边的无向连通图,并且他希望这个图满足下列条件: 该图中不存在重边和自环.也就是说,一条边应该连 ...
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
- [Leetcode Week3]Clone Graph
Clone Graph题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/clone-graph/description/ Description Clon ...
- 【Lintcode】137.Clone Graph
题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...
- CodeForces 715B Complete The Graph 特殊的dijkstra
Complete The Graph 题解: 比较特殊的dij的题目. dis[x][y] 代表的是用了x条特殊边, y点的距离是多少. 然后我们通过dij更新dis数组. 然后在跑的时候,把特殊边都 ...
- 算法与数据结构基础 - 图(Graph)
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...
- ACM - 最短路 - CodeForces 295B Greg and Graph
CodeForces 295B Greg and Graph 题解 \(Floyd\) 算法是一种基于动态规划的算法,以此题为例介绍最短路算法中的 \(Floyd\) 算法. 我们考虑给定一个图,要找 ...
随机推荐
- 手撕fft算法--fft原理和源码解析
一 前言 在音频信号处理中,fft变换是一个无法绕过过去的存在.借着一次算法出来的机会,把fft熟悉一下不为过啊. 二 问题 这里,其实是由一个问题驱动的,那就是:怎么通过fft的变化来得 ...
- 基于六轴传感器MPU6050的物体移动监测报警系统
一 系统简介 1.简介 MPU-60x0 是全球首例 9 轴运动处理传感器.它集成了 3 轴MEMS陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器 DMP(Digital Motion ...
- Python | Flask 解决跨域问题
Python | Flask 解决跨域问题 系列文章目录 目录 系列文章目录 前言 使用步骤 1. 引入库 2. 配置 1. 使用 CORS函数 配置全局路由 2. 使用 @cross_origin ...
- Android Studio批量打渠道包
原文: Android Studio批量打渠道包 - Stars-One的杂货小窝 公司项目渠道包越来越大,每次发版本都是开发人员打包,研究了下如何批量打渠道包,记录过程 步骤 1.gradle配置 ...
- 高防dns和高防IP一样吗?
高防DNS和高防IP一样吗? 高防DNS和高防IP在功能和目标上有所不同,因此它们并不完全相同. 高防DNS是一种针对DNS服务的防护措施,旨在保护域名解析免受DDoS攻击等网络威胁的影响.它利用高防 ...
- #KD-Tree#洛谷 3710 方方方的数据结构
题目 区间加,区间乘,单点查询,撤销修改 分析 由于可以离线,不妨把下标看成第一维,时间看成第二维,那么修改操作相当于在一个矩形上加或者乘, 不妨把查询的节点看作是二维平面上的点,这样实际上就可以用 ...
- #排列组合,dp#LOJ 6069 「2017 山东一轮集训 Day4」塔
题目传送门 分析 两点之间的最小距离其实是由两点高度最大值决定的, 求出长度为 \(n\) 的排列所需距离的方案数,剩下还能放的距离可以用插板法放进去. 也就是 \(\sum_{i=1}^{n^2}f ...
- #dp#CodeChef Little Elephant and Mouses
LEMOUSE 分析 由于被单只老鼠吓到只能算一次,所以前两次走的位置也可能会被老鼠吓到. 设 \(dp[n][m][o][p]\) 表示走到 \((n,m)\) 上一步走的是 \(o\) 这种方式, ...
- OpenHarmony应用开发之自定义弹窗
本文转载自<OpenHarmony应用开发之自定义弹窗>,作者:zhushangyuan_ 应用场景 在应用的使用和开发中,弹窗是一个很常见的场景,自定义弹窗又因为极高的自由度得以广泛应 ...
- OpenHarmony 3.2 Beta源码分析之MediaLibrary
1.MediaLibrary介绍 OpenAtom OpenHarmony(以下简称"OpenHarmony")MediaLibrary媒体库提供了一系列易用的接口用于获取媒体文件 ...