赞
踩
一张完全图的每一条有向边上写着 a a a或者 b b b,问能否构造一条边数为 m m m的不间断路线使该路线为回文串.
随便找两个点,我们发现边数为奇数的回文串是必定能够构造出来的.
随便找一个三元环,假设三个点为
x
,
y
,
z
x,y,z
x,y,z.我们发现其中必定有一个点
y
y
y满足
x
−
>
y
x->y
x−>y和
y
−
>
z
y->z
y−>z是同一个字母,如果不是
y
y
y就调整为
x
x
x或者
z
z
z,肯定有.枚举所有情况可证.
那么对于边数为偶数的回文串,必有
z
,
x
,
z
,
x
,
y
,
z
,
x
,
z
,
x
(
前
面
和
后
面
一
起
加
)
z,x,z,x,y,z,x,z,x(前面和后面一起加)
z,x,z,x,y,z,x,z,x(前面和后面一起加)这条路线可以构造出任意长度边数为偶数的回文串.
唯一一种不存在答案的情况就是边数为偶数,点数为
2
2
2的情况.
所以代码如下.
const int aoi=2038; char c[aoi][aoi]; vector<int> zw; int main() { for (int t=read();t--;) { int n,m,i,j; read(n),read(m); for (i=1;i<=n;++i) scanf("%s",c[i]+1); if (m&1) { puts("YES"); for (i=0;i<=m;++i) printf("%d ",i%2+1);pl; } else { if (n==2) { puts(c[1][2]==c[2][1]?"YES":"NO"); if (c[1][2]==c[2][1]) { for (i=0;i<=m;++i) printf("%d ",i%2+1);pl; } } else { puts("YES"); int f=c[1][2]==c[2][3]?2:c[2][3]==c[3][1]?3:1; for (i=0;i<=m;++i) printf("%d ",(f+i+m-1)%3+1);pl; } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。