D. AB Graph 构造+思维

D. AB Graph 构造+思维

题目大意:

给你一个有向完全图,每一条边都有一个标记,有 a,b 两种标记,问你是否能构造一个长度为 m 的路径,满足按照路径上的标记形成的串是一个回文串。

题解:

分成奇偶讨论:

  • 如果是奇数,那么显然是可以的

  • 如果是偶数:

    • 那么如果存在一条边两个方向是一样的,那么也是可以的

    • 如果不一样,那么你只要找到下面这种情况就可以了:

      image-20210313235053217

      为什么是这种情况呢?如果 n/2 是一个偶数,那么就可以是 y x x y ...

      如果 n/2 是一个奇数,那么可以是 x x y y x x ...

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
typedef long long ll;
char s[maxn][maxn];
void print(int sx,int sy,int m){
    printf("YES
");
    for(int i=1;i<=m+1;i++){
        if(i&1) printf("%d",sx);
        else printf("%d",sy);
        if(i==m+1) printf("
");
        else printf(" ");
    }
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
        if(m&1) print(1,2,m);
        else{
            int sx = 0,sy = 0;
            for(int i=1;i<=n;i++) {
                for (int j = 1; j <= n; j++) {
                    if (i == j) continue;
                    if (s[i][j] == s[j][i]) sx = i, sy = j;
                }
            }
            if(sx) print(sx,sy,m);
            else{
                if(n==2) printf("NO
");
                else{
                    printf("YES
");
                    int a = 0,b = 0,c = 0;
                    if (s[1][2] == s[2][3])a = 1, b = 2, c = 3;
                    else if (s[2][3] == s[3][1])a = 2, b = 3, c = 1;
                    else if (s[3][1] == s[1][2])a = 3, b = 1, c = 2;
                    int val = m/2;
                    if(val&1){
                        for(int i=1;i<=m+1;i++){
                            if (i % 4 == 1) printf("%d",a);
                            else if (i % 4 == 2) printf("%d",b);
                            else if (i % 4 == 3) printf("%d",c);
                            else  printf("%d",b);
                            if(i==m+1) printf("
");
                            else printf(" ");
                        }
                    }
                    else{
                        for(int i=1;i<=m+1;i++){
                            if(i%4==1) printf("%d",b);
                            else if(i%4==2) printf("%d",c);
                            else if(i%4==3) printf("%d",b);
                            else printf("%d",a);
                            if(i==m+1) printf("
");
                            else printf(" ");
                        }
                    }
                }
            }
        }
    }
}
原文地址:https://www.cnblogs.com/EchoZQN/p/14531186.html