Codeforces 1481D AB Graph 三元环结论,构造

构建回文路线:有向图中构造奇偶边回文串的技巧
文章探讨了在完全图中,如何利用特定路径构造回文串的问题,指出奇数边回文串可通过任意两点间路径实现,偶数边回文串则可通过特殊构造如'z,x,z,x,...'来覆盖所有情况,特别指出n=2时是唯一例外。代码展示了解决策略。

文章目录

题意

一张完全图的每一条有向边上写着 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;
      }
    }
  }  
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值