首页 > 其他分享 >[NOIP2018 提高组] 旅行

[NOIP2018 提高组] 旅行

时间:2024-11-09 11:43:26浏览次数:1  
标签:旅行 int 提高 dfs NOIP2018 vis MAXN ans Delete

算法

对于一棵树的情况, dfs + 贪心选取显然是正确的
对于基环树的情况
我们观察到城市不能重复行走
所以长为 \(L\) 的环最多只会被访问 \(L - 1\) 条边
枚举断边, 再跑 dfs + 贪心即可

代码

#include <bits/stdc++.h>
const int MAXN = 5e3 + 20;

int n, m;
std::vector<int> e[MAXN], ans;

int U[MAXN], V[MAXN];

class Subtast_1
{
private:

public:
    bool vis[MAXN];
    int res[MAXN];
    void dfs(int u)
    {
        ans.push_back(u), vis[u] = true;
        for (int i = 0; i < e[u].size(); ++i)
        {
            int v = e[u][i];
            if (!vis[v])
                dfs(v);
        }
    }

    void solve()
    {
        dfs(1);
        for (int i = 0; i < ans.size(); ++i)
            std::cout << ans[i] << " ";
    }
} s1;

class Subtask_2
{
private:

public:
    int res[MAXN], ans[MAXN];
    bool cmp()
    {
        for (int i = 1; i <= n; ++i)
            if (res[i] < ans[i])
                return true;
            else if (res[i] > ans[i])
                return false;
        return false;
    }

    int Delete_u, Delete_v, Past_Cnt = 0;
    bool NotbeDelete(int u, int v)
    {
        if ((u == Delete_u && v == Delete_v) || (u == Delete_v && v == Delete_u))
            return false;
        return true;
    }

    bool vis[MAXN];
    void dfs(int u)
    {
        vis[u] = true, res[++Past_Cnt] = u;
        for (int i = 0; i < e[u].size(); ++i) {
            int v = e[u][i];
            /*不跑删边*/
            if (!vis[v] && NotbeDelete(u, v))
                dfs(v);
        }
    }

    void solve()
    {
        for (int i = 1; i <= m; ++i)
        {
            int u = U[i], v = V[i];

            memset(res, 0, sizeof(res));
            memset(vis, false, sizeof(vis));
            Past_Cnt = 0;
            Delete_u = u, Delete_v = v;

            /*判断删掉的这条边在不在环上*/
            dfs(1);
            if (Past_Cnt < n)
                continue;

            bool Best = cmp();
            if (ans[1] == 0 || Best)
                memcpy(ans, res, sizeof(res));
        }

        for (int i = 1; i <= n; ++i)
            std::cout << ans[i] << " ";
    }
} s2;
int main()
{
    scanf("%d %d", &n, &m);
    for (int i = 1, u, v; i <= m; ++i) {
        scanf("%d %d", &u, &v);
        e[u].push_back(v), e[v].push_back(u), U[i] = u, V[i] = v;
    }
    for (int i = 1; i <= n; ++i)
        sort(e[i].begin(), e[i].end());

    if (m == n - 1)
        s1.solve();
    else if (m == n)
        s2.solve();

    return 0;
}

总结

断边后, 基环树可按照树的方式处理

标签:旅行,int,提高,dfs,NOIP2018,vis,MAXN,ans,Delete
From: https://www.cnblogs.com/YzaCsp/p/18536478

相关文章

  • 【YOLO11改进 - 注意力机制】添加YOLO-Face提出的SEAM注意力,提高遮挡情况下的特征学
    YOLOv11目标检测创新改进与实战案例专栏文章目录:YOLOv11创新改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLOv11目标检测创新改进与实战案例文章目录YOLOv11目标检测创新改进与实战案例专栏介绍......
  • 旅行的逻辑
    旅行经过中间站的旅行方式答案验证历程两地间是否能到达怎么到达网上找到了答案网上没有答案递归命题参数找回自信差点成功调试扩展观止经过中间站的旅行方式答案travel(X,Y,gobyCar(X,Y)):-byCar(X,Y).travel(X,Y,gobyTrain(X,Y)):-byTrain(X,Y).trav......
  • P1525 NOIP2010 提高组 关押罪犯 题解
    Link:P1525NOIP2010提高组关押罪犯-洛谷分析首先题目给出了罪犯与罪犯之间的矛盾关系,这让我们可以想到图或并查集。然后,题目又说了要把罪犯分入两个监狱,也就是把罪犯看作点,要把这些点分入两个集合,这很自然地可以想到二分图。再然后,市长只会去看列表中的第一个事件的影响力......
  • 在复杂环境中,算法定制LiteAIServer视频智能分析平台如何提高对比度识别的准确率?
    随着科技的飞速发展,视频监控已经成为各行各业不可或缺的一部分。然而,视频质量的好坏直接影响到监控效果,其中对比度作为衡量图像质量的重要指标之一,对于视频内容的清晰度和细节表现至关重要。为了提高对比度误报识别的准确率,算法定制LiteAIServer视频智能分析平台凭借其先进的图......
  • C++之OpenCV入门到提高004:Mat 对象的使用
    一、介绍今天是这个系列《C++之Opencv入门到提高》得第四篇文章。这篇文章很简单,介绍如何使用Mat对象来实例化图像实例,了解它的构造函数和常用的方法,这是基础,为以后的学习做好铺垫。虽然操作很简单,但是背后有很多东西需要我们深究,才能做到知其然知其所以然。OpenCV具......
  • 洛谷题单指南-二叉堆与树状数组-P2827 [NOIP2016 提高组] 蚯蚓
    原题链接:https://www.luogu.com.cn/problem/P2827题意解读:初始n个数,每次取最大值x,根据u/v分成两部分:x*u/v,x-x*u/v,然后其余数都增加q,整个过程重复m次。输出有两类数据:第t,2t,3t...次取出的最大值;最后剩余的数第t,2t,3t...个,从大到小输出。解题思路:直观上,通过模拟法可以实......
  • APP广告变现怎么提高收益?
    1、激励视频广告一般来说,APP内开通的广告位越多,广告收益就越高。在所有的广告类型里面,激励视频的价格最高,其次是开屏广告,信息流广告banner广告,相对其他广告类型而言,通过激励视频进行广告变现是需要用户主动参与的。所以在这个过程中,用户的参与度,APP内部的广告部署逻辑就尤为......
  • 金蝶与旺店通数据集成:提高采购退货效率
    金蝶-退料申请单到旺店通-采购退货单【外仓、中转仓】数据集成案例分享在企业的供应链管理中,退料和采购退货是两个关键环节。为了实现这两个环节的数据无缝对接,我们采用了轻易云数据集成平台,将金蝶云星空的退料申请单数据高效集成到旺店通·旗舰奇门的采购退货单中。本次案例将重......
  • JOISC 2022 飞机旅行
    一个基础做法Alice给点标号,Bob可以传一个\(2^{20}\)的信息给Alice,意味着Alice只能知道点的部分信息,然后根据部分信息得把剩余需要的信息传给Bob。考虑树分块,子树大小\(\ge7\)的时候就划为一块,由于是二叉树(一开始以某个\(\le2\)度点为根),那每个子树的大小在\([7,13......
  • SSL 固定(SSL Pinning)是一种提高应用程序安全性的技术,用于防止中间人攻击(MITM,Man-in-th
    SSL固定(SSLPinning)是一种提高应用程序安全性的技术,用于防止中间人攻击(MITM,Man-in-the-Middleattacks)和证书伪造攻击。它通过将服务器的SSL/TLS证书或其公钥“固定”到客户端应用程序中,确保客户端在与服务器通信时只信任特定的证书或公钥,从而降低了遭遇伪造证书或中间人攻击的......