首页 > 其他分享 >AtCoder-abc345_f题解

AtCoder-abc345_f题解

时间:2024-03-17 11:45:56浏览次数:35  
标签:度数 满足条件 false AtCoder 题解 奇数 li abc345 true

题意简述

给定一个无向图。你要在其中选出一些边,使得选出的边所构成的图中,度数为奇数的点有 \(K\) 个。如果可以,输出选了哪些边,否则输出 -1

思路

首先在选一条边时,边两端点度数的奇偶性一定都会改变,即要么都变为奇数,要么两个点的奇偶性交换过来,要么都变为偶数。这三种情况时满足条件的点的个数分别变为 \(+2,0,-2\)。因此无论怎么选边,度数为奇数的点只能有偶数个。所以 \(K \equiv 1 \pmod 2\) 时一定无解。

题目没说图一定连通,所以我们可以对每个连通块分别处理。所以我们只需要处理单个连通块。

假设这个连通块有 \(N\) 个节点,那么这个连通块在选边后最多能有几个点的度数为奇数呢?

答案是 \(N-(N \bmod 2)\),即不大于 \(N\) 的最大偶数。为什么呢?

我们先求出这个图的 DFS 树。此时树中有 \(N-1\) 条边。在 DFS 时,同时维护子树大小 \(sz\) 和搜索时该点度数的奇偶性 \(li\)(奇数为 \(true\),偶数为 \(false\))。

我们在遍历的时候,假设遍历到了 \(u \to v\) 这条边,\(u\) 的父亲是 \(f\)。如果 \(li_v=false\),就选择 \(u \to v\) 这条边,并把 \(li_v\) 标记为 \(true\),\(li_u\) 反转。便利完所有出边后,会有下面几种情况:

  • \(li_u=true\)

此时 \(u\) 已经满足条件了。回到 \(f\) 时,\(f \to u\) 的这条边不会被选。对 \(u\) 的搜索结束,\(u\) 可以满足条件。

  • \(li_u=false\)

此时 \(u\) 没有满足条件。那么在回到 \(f\) 时,则会选择 \(f \to u\) 这条边,使得 \(u\) 满足条件。

这么看来所有的点都会满足条件,除了根节点。如果 \(N \equiv 1 \pmod 2\),则除根节点之外的点都已经满足条件,根节点无法满足条件。否则根节点也可以满足条件。

我们在搜索的时候可以记录还需要让多少个点满足条件。设这个值为 \(w\)。那么我们在选边的时候,根据上面遍历到 \(u \to v\) 时的几种情况再做出相应做法:

  • \(w=0\)

这条边不选即可。

  • \(w>0\)

    • \(li_v=false\)

我们选择这条边,使得 \(v\) 满足了条件,\(w \gets w-1\)。

接下来我们计算出 \(li_u\),如果为 \(true\),则该点由不满足条件变为满足条件,\(w \gets w-1\)。否则该点由满足条件变为不满足条件,\(w \gets w+1\)。

    • \(li_v=true\)

这条边不选即可。

可以发现,在选择一条边后,\(w\) 值要么不变,要么 \(-2\)。这样最后如果 \(w=0\),则有解,否则无解。

到这里,最后一个问题就是记录选择哪些边了。我们可以使用链式前向星存图,因为是无向图,每个边存两次。我们可以从编号 \(2\) 开始存,第一条边的编号为 \(2,3\),第二条为 \(4,5\)。我们再用一个 \(ans\) 数组,如果这条边选了,我们把对应边编号的 \(ans\) 值设为 \(true\)。这样每条边编号除以二下取整就是它实际边的编号。

那么这个问题就解决了。

代码

标签:度数,满足条件,false,AtCoder,题解,奇数,li,abc345,true
From: https://www.cnblogs.com/lrxmg139/p/18078359

相关文章

  • P2633 Count on a tree 题解
    题目链接:Countonatree大概可以认为是树上主席树的板子我在之前的某些题解提到了,主席树一般来说有两个基本功能:可持久化功能,可以选择回退或者新增版本。对于可差性问题,可以有更好的转化为前缀和做法,常见的问题为权值类型问题。在树上的路径第\(k\)大,显然如果我们能......
  • 【洛谷 P8661】[蓝桥杯 2018 省 B] 日志统计 题解(滑动窗口+优先队列+双端队列+集合)
    [蓝桥杯2018省B]日志统计题目描述小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有NNN行。其中每一行的格式是tsid,表示在......
  • 【洛谷 P8602】[蓝桥杯 2013 省 A] 大臣的旅费 题解(图论+深度优先搜索+树的直径+链式
    [蓝桥杯2013省A]大臣的旅费题目描述很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同......
  • [CF1943C] Tree Compass 题解
    不会2300,完蛋了/lh题目链接题目分析容易想到先求出直径,然后以直径中点为圆心画\({d\over2}+O(1)\)个圆。具体地,设直径点数为\(d\)。当\(d\)为奇数时,上述构造需要\(d+1\over2\)次操作;当\(d\)为偶数时,上述构造需要\({d\over2}+1\)次操作。尝试证明上述......
  • ABC345 A ~ D
    ABC345题外话:巨难。A翻译现在给你一个字符串,定义一个合法的箭头由一个<,\(k\)个=,一个>组成的长度为\(k+2\)的字符串。问字符串\(s\)是否是一个合法的箭头。思路赛时因为翻译问题,吃了\(1\)发罚时。只需要判断\(s_1\)是否为<,\(s_2\sims_{n-1}\)是否为=,\(s_......
  • AT_abc345_d 题解
    是个逆天搜索。最开始:爆搜,启动!然后TLE到飞起。赛后:我【数据删除】这么简单的吗?!dfs每个位置,试着把没放过的块放到以这个位置为左上角的区域里面。好了没了,就是这么简单!对了记得这个块可以旋转!#include<stdio.h>#include<bits/stdc++.h>#defineN1000010#defineMOD9......
  • AtCoder Beginner Contest 345
    是这样的,C的longlong只开了ans没开全局,AC12WA12,调了一个小时,在赛后1min发现了该错误。没开longlong见祖宗,望周知;这是C的码,简单的小题一只,可怜的longlong。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;strings;intn,f,ans;map<char......
  • 关于nvim插件telescope-fzf-native在windows下未构建的问题解决
    关于nvim插件telescope-fzf-native在windows下未构建的问题解决首先进入文件夹(没有就自己创建注意文件夹名就是telescope-fzf-native.nvim)C:\Users\...\AppData\Local\nvim-data\site\pack\packer\start\telescope-fzf-native.nvim进入此路径的powershell或者cmd命令行,执行......
  • 启动应用程序出现cmdial32.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个cmdial32.dll文件(挑选合适的版本文件)把它......
  • 启动应用程序出现comcat.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个comcat.dll文件(挑选合适的版本文件)把它放......