「CF858F」 Wizard's Tour

传送门
Luogu

解题思路

首先对于树的情况,我们很显然有一种贪心策略:
对于每一个节点先匹配子树,然后在还可以匹配的儿子间尽可能匹配,要是多出来一个就往上匹配。
推广到图的情况。。。
我们在图的生成树上 \(\text{DFS}\) ,即时删边,防止重复访问。
然后记录一个 \(f[x]\),表示直接与 \(x\) 节点并且还可以用来匹配的点。
那么我们直接一边 \(\text{DFS}\) ,一边匹配就好了。
最后输出答案即可。

细节注意事项

  • 没什么细节,就是要仔细想一想

参考代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#include <set>
#define rg register
#define file(x)                                     freopen(x".in", "r", stdin);                    freopen(x".out", "w", stdout);
using namespace std;
template < typename T > inline void read(T& s) {
    s = 0; int f = 0; char c = getchar();
    while (!isdigit(c)) f |= (c == '-'), c = getchar();
    while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
    s = f ? -s : s;
}

const int _ = 200010;
const int __ = 400010;

int tot = 1, head[_], nxt[__], ver[__];
inline void Add_edge(int u, int v)
{ nxt[++tot] = head[u], head[u] = tot, ver[tot] = v; }

int n, m, vis[_] = { 1 }, f[_];
int cnt; struct node{ int x, y, z; }t[_];

inline void dfs(int u) {
    vis[u] = 1;
    for (rg int v, i = head[u]; i; i = nxt[i]) {
        v = ver[i], ver[i] = ver[i ^ 1] = 0;
        if (v != 0) {
            if (!vis[v]) dfs(v);
            if (f[v]) t[++cnt] = (node) { u, v, f[v] }, f[v] = 0;
            else if (f[u]) t[++cnt] = (node) { f[u], u, v }, f[u] = 0;
            else f[u] = v;
        }
    }
}

int main() {
    read(n), read(m);
    for (rg int u, v, i = 1; i <= m; ++i)
        read(u), read(v), Add_edge(u, v), Add_edge(v, u);
    for (rg int i = 1; i <= n; ++i) if (!vis[i]) dfs(i);
    printf("%d\n", cnt);
    for (rg int i = 1; i <= cnt; ++i)
        printf("%d %d %d\n", t[i].x, t[i].y, t[i].z);
    return 0;
}

完结撒花 \(qwq\)

「CF858F」 Wizard's Tour

原文地址:https://www.cnblogs.com/zsbzsb/p/11745839.html

时间: 2024-08-30 13:36:47

「CF858F」 Wizard's Tour的相关文章

CF858F Wizard&#39;s Tour

也许更好的阅读体验 \(\mathcal{Description}\) 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次旅游,每次旅游可以任选一个点 \(x\) 作为起点,再走到一个与 \(x\) 直接有边相连的点 \(y\),再走到一个与 \(y\) 直接有边相连的点 \(z\) 并结束本次旅游. 作为一个旅游爱好者,你不希望经过任意一条边超过一次,注意一条边不能即正向走一次又反向走一次,注意点可以经过多次,在满足

程序员与新技术之间的「爱」与「恨」

我们大部分做技术的,对新技术是又爱又恨. 爱的是他能让枯燥反复的工作重新获得新鲜感. 恨的是新技术太多了,学不动啊. 真到了实际要运用的时候,不同人对待新技术的态度相差很大,有的看上去很积极,有的又看上去很排斥. 一般来说,技术团队的管理者往往是“排斥者”,而团队的成员是“拥抱者”的概率居多. 看看下面这个景象是不是很熟悉? 程序员小明:老大,XX系统太乱了,需要重构一下.我建议用XX技术,它的优点有XX.XX.XX.我开了一个分支,在项目中引入测试过了,没啥问题.重构应该要趁早,否则简直是煎熬

AC日记——「HNOI2017」单旋 LiBreOJ 2018

#2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxtree maxn<<2 int val[maxtree],tag[maxtree],L[maxtree],R[maxtree],mid[maxtree]; int op[maxn],ki[maxn],bi[maxn],cnt,size,n,ch[maxn]

「随笔」基于当下的思考

马德,说好的技术blog,变成日记本了... 下午的时候莫名其妙的感到很颓废,因为自己的不够强大感到忧虑和危机感十足.现在每每行走在技术的道路上,常觉得如履薄冰,如芒在背. 上大学之前和现在的心态其实差别挺大的,视野的开阔远远不止局限于自己的脚下.不过,这里的「上大学之前」只是一个时间描述词,并不觉得大学是最适合学习的地方,我很失望. 世界上的人无论性别,区域,宗教,兴趣爱好,总可以在互联网上找到志趣相同的人,总是可以不断打破自己的常识与惯性思维.总是有在相同领域比自己更强的人,挺好的. 关于知

「Unity」与iOS、Android平台的整合:3、导出的Android-Studio工程

本文属于「Unity与iOS.Android平台的整合」系列文章之一,转载请注明出处. Unity默认导出的是Android-Eclipse工程,毕竟Eclipse for Android开发在近一两年才开始没落,用户量还是非常巨大的. 个人认为AndroidStudio非常好用,能轻易解决很多Eclipse解决不了或者很难解决的问题. 所以我将Unity导出的Andoid工程分为Eclipse和AndroidStudio两部分. 不过我之后的相关内容都会使用AndroidStudio,希望依然

大数据和「数据挖掘」是何关系?---来自知乎

知乎用户,互联网 244 人赞同 在我读数据挖掘方向研究生的时候:如果要描述数据量非常大,我们用Massive Data(海量数据)如果要描述数据非常多样,我们用Heterogeneous Data(异构数据)如果要描述数据既多样,又量大,我们用Massive Heterogeneous Data(海量异构数据)--如果要申请基金忽悠一笔钱,我们用Big Data(大数据) 编辑于 2014-02-2817 条评论感谢 收藏没有帮助举报作者保留权利 刘知远,NLPer 4 人赞同 我觉得 大数据

开放的智力8:实用「成功学」

可实现的「成功学」 现在我想为这里的年轻人介绍一种可实现的「成功学」.希望这个我自创的理论,可以改变很多人的一生. 当我们评价一个事情值不值得去做.应该花多少精力去做的时候,应该抛弃单一的视角,而是分两个不同的维度来看,一是该事件将给我带来的收益大小(认知.情感.物质.身体方面的收益皆可计入),即「收益值」:二是该收益随时间衰减的速度,我称为「收益半衰期」,半衰期长的事件,对我们的影响会持续得较久较长. 这两个维度正交以后就形成了一个四象限图.我们生活.学习和工作中的所有事情都可以放进这个图里面

Linux 小知识翻译 - 「syslog」

这次聊聊「syslog」. 上次聊了「日志」(lgo).这次说起syslog,一看到log(日志)就明白是怎么回事了.syslog是获取系统日志的工具. 很多UINIX系的OS都采用了这个程序,它承担了「获取系统全部的日志」这个维持系统正常运行的重要任务. syslog的本体是「syslogd」这个daemon(一般翻译成守护进程),常驻内存中获取日志. syslog的特点是可以通过配置文件「/etc/syslog.conf」,对「哪种应用程序?哪种重要度的信息?记录在哪个文件中?」等进行细致的

Linux 小知识翻译 - 「日志」(log)

这次聊聊「日志」. 「日志」主要指系统或者软件留下的「记录」.出自表示「航海日志」的「logbook」. 经常听说「出现问题的时候,或者程序没有安装自己预期的来运行的时候,请看看日志!」. 确实,记录了系统和软件详细运行情况的「日志」是信息的宝库,通过日志来解决问题的事例也非常多. 但事实上,「无论如何也不会看日志」的用户也有很多.理由很简单,日志的信息量非常大,全部用眼睛来看的话是非常吃力的. 而且,英语写的日志也会让英文不好的人敬而远之. 虽说「要养成用眼睛来看日志的习惯」,但实行起来却非常