AtCoder Beginner Contest 456 E补题(分层图 + 有向环检测 )

1.E - Endless Holidays--原题链接

2.题目截图

3.思路历程

题目明确说明了,晚上会进行选择,留在当前城市或者移动到下一个城市,想要每天都在假日城市里待着,这里说了,一次只能动一次(赛时理解错了,以为随便跑,我说怎么这么简单写了个并查集发现样例过不了直接急哭了)。然后理解这个,思路就很明确了。

我们每次只能从假期城市移动到假期城市,而且每周最多只有十天,数据很小,我们直接考虑分层图,把每一天的数据都存下来,然后只有两个均为假日且有联通在存为有通路,理解这个逻辑并构建出分层图之后,我们剩下的就判断是否成环就行,这里我是用的拓扑排序染色法写的,有环yes没环no,这题就a了

4.ac代码

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=100000;
 array<int,2> ed[N*3+5];
 string s[N+5];
 vector <int> h[N*10+5];
 int color[N*10+5];//三色颜色,对应三种状态,0未遍历,-1正在遍历,1遍历完成
bool tin = 1; // 是否多组测试,默认为单组
bool dfs(int x)//染色法拓扑排序
{
    color[x]=-1;//正在遍历
    for(auto y:h[x])
    {
        if(color[y]==-1)//遇到正在便利的,说明是环
        return 1;
        if(!color[y])//没遍历过的
        {
            if(dfs(y))//继续搜下去
            return 1;
        }
    }
    color[x]=1;//遍历结束
    return 0;
}
bool have_cycle(int n,int w)//检查有无环
{
    int e=n*w;//分层之后总的节点数
    for(int i=1;i<=e;i++)//重置颜色数组
    {
        color[i]=0;
    }
    for(int i=1;i<=n;i++)
    {
        if(!color[i])//遇到没遍历的进行染色,因为规定了第一天去,所以只有1-n
        {
            if(dfs(i))
            return 1;
        }
    }
    return 0;
}
void solve() {
    int n,m,x,y;
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        cin>>x>>y;
        ed[i*2]={x,y};//双向存单向,先存下来
        ed[i*2+1]={y,x};//先
    }
    int w,ue=2*m+n;
    cin>>w;
    for(int i=1;i<=n;i++)
    cin>>s[i];
    for(int i=0;i<n;i++)
    {
        ed[i+2*m]={i+1,i+1};//因为可以留下来,所以存一个自己到自己
    }
        for(int i=1;i<=n;i++)
    {
        for(int j=0;j<w;j++)
        {
                h[n*j+i].clear();//重置图
        }
    }
    for(int i=0;i<ue;i++)
    {
        for(int j=0;j<w;j++)
        {
            int neday=(j+1)%w;
            if(s[ed[i][0]][j]=='o'&&s[ed[i][1]][neday]=='o')//可以从j的ed[i][0],到达下一天的ed[i][1],存图
            {
                h[n*j+ed[i][0]].push_back(n*neday+ed[i][1]);//这里n*j和n*neday是为了完成分层
            }
        }
    }
    if(have_cycle(n,w))//有环yes没环no
    {
        cout<<"Yes"<<endl;
    }
    else
    cout<<"No"<<endl;
}
 
signed main() {
    ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
    int T = 1;
    if (tin) cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

翻译用的deepseek,还挺不错的

相关推荐
一晌小贪欢24 分钟前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
zh_xuan31 分钟前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长40 分钟前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚1 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
·present·1 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++
早起CaiCai1 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码2 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
旖旎夜光2 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
猿人谷2 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构