zoukankan      html  css  js  c++  java
  • 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(" ");
                            }
                        }
                    }
                }
            }
        }
    }
    
  • 相关阅读:
    Mongoose Schemas中定义日期以及timestamps选项的妙用
    如何用Linux的命令正确识别cpu的个数和核数【转】
    缓存算法
    使用pm2常见问题
    JavaScript 循环:如何处理 async/await
    常用的Linux操作
    Mysql数据库If语句的使用
    java解析邮箱中的邮件信息
    淘宝分布式数据层TDDL
    maven正式版本和快照版本的区别
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/14531186.html
Copyright © 2011-2022 走看看