蓝桥&搜狐畅游 圣诞树 图论

65 阅读1分钟

image.png image.png image.png

思想

题目给的样例的意思是

11行)
33个节点)
101  (三个连续的节点的颜色)
1 2   (节点1 ~ 节点2之间有一条边)
2 3   (节点2 ~ 节点3之间有一条边)

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=100;

bool isflag=0;

vector<int>Graph[N];//建立的图
char storing[N];


//判断是否美观
void check (int i)
{
    int count=0;
    for (auto x : Graph[i]) 
    {
        if (storing[x] == storing[i]) count++;
    }
    if (count >= 2) isflag=1;
}

int main()
{
    int T;cin>>T;
    while(T--)
    {
        for(int i=0;i<100;i++) storing[i]=0;//初始化字符串
        for(int i=0;i<100;i++) 
        {
            Graph[i].clear();//清空图的每一条边
        }

        int n;cin>>n;
        scanf("%s",storing+1);//输入字符串   +1是因为要存'/0'

        for (int i=1;i<=n-1;i++)//因为要输入n-1行,为了防止越界,i不从0开始
        {
            int head,tail;cin>>head>>tail;
            Graph[tail].push_back(head);//从tail节点可以走到head节点,说明两个节点是相邻的
            Graph[head].push_back(tail); //从head节点可以走到tail节点,说明两个节点是相邻的
        }
        isflag=0;
      
        for (int i=1;i<=n;i++)
        {
            check(i);
            if (isflag==1) break;
        }
        if (isflag==1) cout<<"NO"<<'\n';
        else cout<<"YES"<<'\n';
    }
}