码迷,mamicode.com
首页 > 其他好文 > 详细

D. AB Graph 构造+思维

时间:2021-03-15 11:36:24      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:max   printf   ref   continue   lazy   思维   get   image   bit   

D. AB Graph 构造+思维

题目大意:

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

题解:

分成奇偶讨论:

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

  • 如果是偶数:

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

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

      技术图片

      为什么是这种情况呢?如果 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\n");
    for(int i=1;i<=m+1;i++){
        if(i&1) printf("%d",sx);
        else printf("%d",sy);
        if(i==m+1) printf("\n");
        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\n");
                else{
                    printf("YES\n");
                    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("\n");
                            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("\n");
                            else printf(" ");
                        }
                    }
                }
            }
        }
    }
}

D. AB Graph 构造+思维

标签:max   printf   ref   continue   lazy   思维   get   image   bit   

原文地址:https://www.cnblogs.com/EchoZQN/p/14531186.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!