Even Degree【2020 年 “游族杯”E题】【欧拉回路】

2023-11-16

题目链接


  题意:有N个点,M条边,每次可以删去一条两端点的度不都是奇数的边,问最多可以删除几条边?题目保证初始所有点度为偶数。

  首先,题目保证了初始的时候所有的点的度都是为偶数的,于是原图中的每一个联通块一定是一个欧拉回路,对于欧拉回路,最好的情况下,一定是最后剩下一条边,链接着两个度为1的点,并且一定是可以如此满足的。

  于是,对于每个有mm条边的联通块,一定会有mm-1条边是可以删去的,但是具体怎么删去呢?我们不能直接按着欧拉回路的跑法直接删去,会有这样的bug:

具体:如果我们先删除第一条边,再删除的是第二条边,实际上,第二条边的两个端点都是奇数度了。

  所以,为了避免这样的情况,我们可以假设现在的是去除一条边的欧拉通路——欧拉回路删除一条边后,形成两个奇数点,变成一个典型的欧拉通路。于是,我们就可以得到了两个奇数点了,作为欧拉通路的起点和终点,每次进行删除边,实际上就是在改变欧拉通路的起点或者是终点,这里可以自己画图进行观察得到。

  于是,作为欧拉通路,我们只需要不选起点和终点构成的边就可以了,于是可以用两边同时判断来进行取的方式来进行区分。保证不取到起、终点,同时维护好了欧拉图的性质。

5 7
1 4
1 3
1 2
1 2
2 3
2 5
4 5
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 5e5 + 7;
int N, M, head[maxN], cnt;
bool vis[maxN] = {false};
struct Eddge
{
    int nex, to, id;
    Eddge(int a=-1, int b=0, int c=0):nex(a), to(b), id(c) {}
} edge[maxN << 1];
inline void addEddge(int u, int v, int id)
{
    edge[cnt] = Eddge(head[u], v, id);
    head[u] = cnt++;
}
inline void _add(int u, int v, int id) { addEddge(u, v, id); addEddge(v, u, id); }
pair<int, int> pir[maxN];
vector<int> ans;
int Stap[maxN], Stop;
void dfs(int u)
{
    int v, i;
    while(~head[u])
    {
        i = head[u];
        v = edge[i].to;
        head[u] = edge[i].nex;
        if(vis[edge[i].id]) continue;
        vis[edge[i].id] = true;
        dfs(v);
        Stap[++Stop] = edge[i].id;
    }
}
void Del()
{
    int l = 2, r = Stop;
    int old_u = pir[Stap[1]].first, old_v = pir[Stap[1]].second, now_u, now_v;
    ans.push_back(Stap[1]);
    while(l < r)
    {
        now_u = pir[Stap[r]].first; now_v = pir[Stap[r]].second;
        if(min(old_u, old_v) != min(now_u, now_v) || max(old_u, old_v) != max(now_u, now_v))
        {
            ans.push_back(Stap[r--]);
            if(old_u == now_u) old_u = now_v;
            else if(old_u == now_v) old_u = now_u;
            else if(old_v == now_u) old_v = now_v;
            else if(old_v == now_v) old_v = now_u;
        }
        else
        {
            now_u = pir[Stap[l]].first; now_v = pir[Stap[l]].second;
            ans.push_back(Stap[l++]);
            if(old_u == now_u) old_u = now_v;
            else if(old_u == now_v) old_u = now_u;
            else if(old_v == now_u) old_v = now_v;
            else if(old_v == now_v) old_v = now_u;
        }
    }
}
inline void init()
{
    cnt = 0;
    for(int i=1; i<=N; i++) head[i] = -1;
}
int main()
{
    scanf("%d%d", &N, &M);
    init();
    for(int i=1, u, v; i<=M; i++)
    {
        scanf("%d%d", &u, &v);
        _add(u, v, i);
        pir[i] = make_pair(u, v);
    }
    for(int i=1; i<=N; i++)
    {
        Stop = 0;
        dfs(i);
        if(Stop) Del();
    }
    int len = (int)ans.size();
    printf("%d\n", len);
    for(int i=0; i<len; i++) printf("%d%c", ans[i], i == len - 1 ? '\n' : ' ');
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Even Degree【2020 年 “游族杯”E题】【欧拉回路】 的相关文章

  • 质数

    include
  • 欧拉回路【总结】【题解】

    题目 欧拉回路 UOJ 欧拉回路 Liuser s OJ 题目描述 有一天一位灵魂画师画了一张图 现在要你找出欧拉回路 即在图中找一个环使得每条边都在环上出现恰好一次 一共两个子任务 无向图 有向图 输入格式 第一行一个整数 t 表示子任务
  • 图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂!

    文章目录 1 Dijkstra算法简介 2 算法实现范例 3 邻接矩阵 4 Dijkstra 算法的 C 描述 5 Dijkstra 算法的 Matlab 描述 6 温故知新 1 Dijkstra算法简介 背景 迪杰斯特拉算法 Dijkst
  • hdu 2586 How far away ?

    Problem acm hdu edu cn showproblem php pid 2586 Meaning 给一棵 n 个点的树 和 n 1 条边的边权 多次询问树上两点的距离 Analysis 以任意顶点为根 DFS 预处理出所有结点
  • 二分图最大完美匹配

    嗯 想不通 就是二分之后的点 寻找左边的点和右边的点的保证两条边的顶点不相同的最大边数 匈牙利算法 O mn 左边寻找和右边相邻的边 如果右边还没有和左边进行连线 那么匹配成功 如果右边已经进行连线 那么考虑左边是否能更改连线 换一个右边
  • Road Construction POJ - 3352(tarjan双连通缩点模板)

    题目描述 给一个无向连通图 至少添加几条边使得去掉图中任意一条边不改变图的连通性 即使得它变为边双连通图 include
  • 无向图的遍历-BFS与DFS

    一 理论部分 无向图的遍历可用深度搜索 DFS 与广度搜索 BFS 深度搜索的基本方式是由图的一个节点1出发然后随机选一个与其相邻的节点2 接着在选择一个与其相邻的节点3 当一条路遍历完后再选择最近一个遍历过的 且相邻节点有未遍历过的节点
  • Codeforces Round 867 (Div. 3)(A题到E题)

    链接 Dashboard Codeforces Round 867 Div 3 Codeforces 头一次div3做出来四题 第五题也差临门一脚 赛后看到别人e题跟自己几乎一样的思路肠悔青了 还得练才行 A TubeTube Feed 签
  • 图论17(Leetcode864.获取所有钥匙的最短路径)

    用二进制表示获得的钥匙 假设n 钥匙个数 000000000代表没有钥匙 0000000001代表有idx为1的钥匙 0000000011代表有idx 1 2的钥匙 这方法巧妙又复杂 代码 class Solution static int
  • 西安电子科技大学第二届程序设计新生赛-F-zxy的长跑【欧拉回路】

    题目链接 好极了的欧拉回路 我们想知道怎样才能跑完所有的边 我们可以从度为奇数的点出发 因为这是欧拉回路的无向图的先觉调节 当然 这道题还有另外一种可能就是这是一个环 1 gt 2 2 gt 3 3 gt 4 4 gt 1 那么就没有奇数度
  • PCL点云处理之批量读写点云、随机赋予颜色 并保存

    include
  • 【01规划】POJ 3621 Sightseeing Cows

    POJ 3621 Sightseeing Cows 题意 给定一张 n 个点 m 条边的有向图 每个点都有一个权值 f i 每条边都有一个权值 t i 求图中的一个环 使 环上各点的权值之和 除以 环上各边的权值之和 最大 输出这个最大值
  • 最长公共上升子序列(LCIS)

    前置知识 LCS LIS 注意 刚开始看这个问题的时候 第一反应是先求出LCS再求出LCS的LIS 事实上这是有问题的 我们并不能保证这么求出的LCIS是最长的 比如下面这个例子 Example a 7 1 5 6 4 2 7 b 7 1
  • 数据结构练习题——图(含应用题)

    1 选择题 1 在一个图中 所有顶点的度数之和等于图的边数的 倍 A 1 2 B 1 C 2 D 4 答案 C 2 在一个有向图中 所有顶点的入度之和等于所有顶点的出度之和的 倍 A 1 2 B 1 C 2 D 4 答案 B 解释 有向图所
  • 【算法笔记】Prim算法

    定义 prim算法 图论中的一种算法 可在加权连通图里搜索最小生成树 由此算法搜索到的边子集所构成的树中 不但包括了连通图里的所有顶点 并且其所有边的权值之和最小 算法描述 输入 一个加权连通图 其中顶点集合为V 边集合为E 初始化 Vne
  • 数据结构算法—邻接表存储的无向图求连通分量个数

    数据结构算法 邻接表存储的无向图求连通分量个数 邻接表存储结构 typedef struct ArcNode int adjvex 边指向的顶点 struct ArcNode nextarc 下一条边的指针 ArcNode typedef
  • Dinic算法学至大佬,学以致用【挂上相应的题目】

    这个巨佬讲的超级厉害 学起来很快 还有优化的说呢 Dinic算法 研究总结 网络流 网络流是信息学竞赛中的常见类型 笔者刚学习了最大流Dinic算法 简单记录一下 网络流基本概念 什么是网络流 在一个有向图上选择一个源点 一个汇点 每一条边
  • BFS遍历树和DFS遍历树

    遍历树 按照遍历的顺序 如不清楚图的遍历 请先阅读图的遍历 绘制成树型结构 DFS遍历树 以下为图到遍历树的转化 如果不清楚图的遍历 请先阅读笔者的另一篇文章 图的遍历 动图 按照DFS遍历的顺序 绘制成一棵树 途中红色的边就是遍历过程中没
  • 有向图的拓扑排序

    给定一个 nn 个点 mm 条边的有向图 点的编号是 11 到 nn 图中可能存在重边和自环 请输出任意一个该有向图的拓扑序列 如果拓扑序列不存在 则输出 1 1 若一个由图中所有点构成的序列 AA 满足 对于图中的每条边 x y x y
  • 讲解 最大流问题+最小花费问题+python(ortool库)实现

    文章目录 基本概念 图 邻接矩阵 最大流问题 python解决最大流问题 python解决最大流最小费用问题 喜欢的话请关注我们的微信公众号 你好世界炼丹师 公众号主要讲统计学 数据科学 机器学习 深度学习 以及一些参加Kaggle竞赛的经

随机推荐

  • 软考高项之运筹学

    1 最大最小准则 积极 平稳 消极 A 100 50 20 B 200 150 60 C 500 300 200 A min 20 B min 60 C min 200 最小值中取最大值为200 2 最大最小后悔原则 积极 平稳 消极 A
  • QT调用VS编译的RabbitMQ-C静态库

    为此折腾两天 参考了不少大神的文章 再次标识感谢 把自己的一些思路简单记录下 https blog csdn net qq 70244454 article details 128086920 https blog csdn net zjz
  • java字母和数据混合排序

    import java util ArrayList import java util List public class Sort param args public static void main String args TODO A
  • 用Zotero在word中添加参考文献的方法记录

    插件安装 首先 安装了zotero的话应该默认会安装word插件 如果word里面有这个选项卡 就行 如果没有的话 可以手动安装一下 方法参见官网 word中打开文件 选项 高级 常规 文件位置 启动 修改 不要修改 而是复制一下这个路径
  • 用桥接伪标签训练测试间隙改进弱监督时序动作定位(CVPR 2023)

    Improving Weakly Supervised Temporal Action Localization by Bridging Train Test Gap in Pseudo Labels CVPR 2023 论文地址 2304
  • sel4白皮书翻译

    首发地址 http trialley top pages 53ac44 CSDN地址 https blog csdn net lgfx21 article details 117606097 翻译与转发许可 作者 Gernot Heiser
  • 方方格子授权码_OAuth2入门(三)——Authorization Code授权模式

    1 前言 前面的文章讲到 oauth支持四种授权模式 简化模式 implicit 授权码模式 authorization code 密码模式 resource owner password credentials 客户端模式 client
  • 拆分android项目导致run Configurations消失了

    事件缘由 由于APP要拆分成两个 把原来的APP从svn上面下载下了 重新上传到新的svn目录上 再次重svn上面下载下来到本地新文件夹是直接用svn来运行时 发现原来run Configurations 不见了 重新编译同步啥的都没有用
  • 软件测试工具介绍和使用

    此次为软件工程实践专题 个人博客第四次作业 请使用一些其他平台上的测试工具 并写博客介绍如何在你的项目中具体使用 一 JMeter 介绍 Apache JMeter是Apache组织开发的基于Java的压力测试工具 是100 纯JAVA桌面
  • 多线程数据库连接管理1

    最近公司项目需求 要从oracle往mysql迁移存量1 2亿数据 处理逻辑比较复杂 硬件方面 对机器性能要求较高 软件方面 受制于外部服务能力 因此 在开发过程中 需要特别注意各方面资源的管理 及时释放占用的资源 调优过程中 数据库方面遇
  • OSI七层模型与TCP/IP五层模型

    一 OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识 OSI参考模型 1 OSI的来源 OSI Open System Interconnect 即开放式系统互联 一般都叫OSI参考模型 是ISO 国际标准化组织 组织在1985
  • 用友时空KSOAV9.0文件上传漏洞复现

    一 使用fofa进行资产搜集 语句 app 用友 时空KSOA 访问相关页面 二 漏洞地址 文件上传 POST servlet com sksoft bill ImageUpload filename test jsp filepath 使
  • vue实现列表数据分页

    在开发过程中 当数据不是非常多的时候 前端来处理列表数据的分页 下面分享几个关键的步骤代码 1 请求全部数据过来 getList let params inParams this axios url httpUrl assetsIpArea
  • List中添加多种数据类型 反射

    原文参考地址 http blog csdn net sinat 28789467 article details 57415998 总结来说 以下代码 ArrayList
  • 面试题(1)封装c++

    前言 在学习的过程中我开始积累面试题 让我们一起开始学习 进步吧 卷起来 封装的定义 定义 将数据和操作数据的方法进行有机结合 隐藏对象的属性和实现细节 仅对外公开接口来和对象进行交互 封装本质上是一种管理 就好比如办画展的时候我们要把画用
  • RSA算法简介

    RSA算法简介 一 RSA算法简述 在RSA密码体制中 每个用户都拥有两个密钥 公钥PK e n 和私钥SK d n 公钥PK e n 用于加密 也成为加密密钥 可以再网络 电话簿等媒体上进行公布 私钥SK d n 用于解密 也称为解密密钥
  • 刀片式服务器与虚拟机,为什么人们在开发虚拟主机时更喜欢刀片服务器?

    服务器制造商正在不断开发刀片技术 因此刀片服务器的处理器性能和内存容量已达到10年前的超级计算机水平 毫无疑问 刀片服务器曾经实现了 事半功倍 的承诺 但现在需要重新考虑这个问题 人们为什么在虚拟主机的开发中更喜欢刀片服务器 使刀片服务器缺
  • 为什么mysql source命令导入数据比可视化工具执行sql文件快?

    在一般情况下 使用MySQL的source命令导入数据比使用可视化工具执行SQL文件更快 这是因为涉及到了不同的执行方式和优化策略 批量执行 vs 逐条执行 source命令会将整个SQL文件作为一个批量进行执行 而可视化工具往往是逐条读取
  • VS Code搭配code runnner编译时提示:g++: fatal error: no input files解决方法

    如下图所示 如果我们使用的是windows系统 当我们编写好C 文件之后 执行run code命令 就会出现的下面的错误提示 g error testCodeRunnner cpp No such file or directory g f
  • Even Degree【2020 年 “游族杯”E题】【欧拉回路】

    题目链接 题意 有N个点 M条边 每次可以删去一条两端点的度不都是奇数的边 问最多可以删除几条边 题目保证初始所有点度为偶数 首先 题目保证了初始的时候所有的点的度都是为偶数的 于是原图中的每一个联通块一定是一个欧拉回路 对于欧拉回路 最好