Wizard's Tour

Time Limit: 50 Sec  Memory Limit: 512 MB

Description

  

Input

  

Output

  

Sample Input

  4 5
  1 2
  3 2
  2 4
  3 4
  4 1

Sample Output

  2
  4 1 2
  4 3 2

HINT

  

Solution

  首先,一个连通块的答案可以是floor(m / 2)。考虑如何构造出一种解。

  首先我们先搞出一个dfs树

  那么现在对于一个点,有三种边:1. 非树边;2. 儿子边;3. 父亲边

  我们将非树边儿子边优先级看做一样的父亲边优先级最低

  考虑将配给,即这个点是一种走法中的中点。从叶子节点往上做。两两配对这些边

  显然每条边都被尽可能利用了,最后只有与根相连的边可能会有最多一条用不了。

  这样就是一种解了。

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
using namespace std;
typedef long long s64; const int ONE = ;
const int MOD = 1e9 + ; int get()
{
int res = , Q = ; char c;
while( (c = getchar()) < || c > )
if(c == '-') Q = -;
if(Q) res = c - ;
while( (c = getchar()) >= && c <= )
res = res * + c - ;
return res * Q;
} int ans_len;
struct power
{
int l, mid, r;
}Ans[ONE * ]; int n, m;
int x, y;
int next[ONE * ], first[ONE], go[ONE * ], tot;
int vis[ONE * ]; void Add(int u, int v)
{
next[++tot] = first[u], first[u] = tot, go[tot] = v;
next[++tot] = first[v], first[v] = tot, go[tot] = u;
} vector <power> A;
int fat[ONE]; void Dfs(int u)
{
for(int e = first[u]; e; e = next[e])
{
int v = go[e];
if(fat[v] || vis[e]) continue;
fat[v] = u, Dfs(v);
} A.clear();
for(int e = first[u]; e; e = next[e])
if(!vis[e] && fat[u] != go[e]) A.push_back((power){go[e], , e});
for(int e = first[u]; e; e = next[e])
if(!vis[e] && fat[u] == go[e]) A.push_back((power){go[e], , e}); int p = , len = A.size();
for(int j = ; j + < len; j += )
{
vis[A[j].r] = vis[(A[j].r-^)+] = ;
vis[A[j+].r] = vis[(A[j+].r-^)+] = ;
Ans[++ans_len] = (power){A[j].l, u, A[j + ].l};
}
} int main()
{
n = get(); m = get();
for(int i = ; i <= m; i++)
x = get(), y = get(), Add(x, y); for(int i = ; i <= n; i++)
if(!fat[i]) Dfs(i); printf("%d\n", ans_len);
for(int i = ; i <= ans_len; i++)
printf("%d %d %d\n", Ans[i].l, Ans[i].mid, Ans[i].r);
}

【Codeforces858F】Wizard's Tour [构造]的更多相关文章

  1. Wizard's Tour

    F. Wizard's Tour time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  2. Wizard's Tour CodeForces - 860D (图,构造)

    大意: 给定$n$节点$m$条边无向图, 不保证连通, 求选出最多邻接边, 每条边最多选一次. 上界为$\lfloor\frac{m}{2}\rfloor$, $dfs$贪心划分显然可以达到上界. # ...

  3. CF1053E Euler tour 构造

    正解:构造 解题报告: 传送门! 这种题目一般都是首先考虑合法性 这题也不例外,思考怎么样是合法的呢? 有四点: 1)a[1]=a[2n-1],显然不说 2)若a[i]=a[j],则(j-i)& ...

  4. CodeForces 860D Wizard's Tour

    题意 给出一张无向图,要求找出尽量多的长度为2的不同路径(边不可以重复使用,点可以重复使用) 分析 yzy:这是原题 http://www.lydsy.com/JudgeOnline/problem. ...

  5. CF858F Wizard's Tour 解题报告

    题目描述 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次旅游,每次旅游可以任选一个点 \(x\) 作为起点,再走到一个 ...

  6. CF858F Wizard's Tour

    也许更好的阅读体验 \(\mathcal{Description}\) 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次 ...

  7. 「CF858F」 Wizard's Tour

    传送门 Luogu 解题思路 首先对于树的情况,我们很显然有一种贪心策略: 对于每一个节点先匹配子树,然后在还可以匹配的儿子间尽可能匹配,要是多出来一个就往上匹配. 推广到图的情况... 我们在图的生 ...

  8. Codeforces Round #434 (Div. 2)

    Codeforces Round #434 (Div. 2) 刚好时间对得上,就去打了一场cf,发现自己的代码正确度有待提高. A. k-rounding 题目描述:给定两个整数\(n, k\),求一 ...

  9. poj 题目分类(2)

    初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj329 ...

随机推荐

  1. 6/12 sprint2 看板和燃尽图的更新

  2. LeetCode题解:(19) Remove Nth Node From End of List

    题目说明 Given a linked list, remove the nth node from the end of list and return its head. For example, ...

  3. PAT 甲级 1137 Final Grading

    https://pintia.cn/problem-sets/994805342720868352/problems/994805345401028608 For a student taking t ...

  4. python selenium 代码

    from selenium import webdriver from selenium.common.exceptions import TimeoutException, NoSuchElemen ...

  5. mysql索引利弊分析

    转载自:http://blog.csdn.net/linminqin/article/details/44342205  索引的利弊与如何判定,是否需要索引 相信读者都知道索引能够极大地提高数据检索的 ...

  6. 如何处理UIVIew addsubview 不显示subview

    老代码: addsubview不显示uilabel -(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSIn ...

  7. UpdateBatch到底是怎么用的?

    要使用ADOQuery的UpdateBatch函数,必须将ADOQuery的LockType属性设置成ltBatchOptimistic

  8. QProcess 进程调用

    1. 调用方的接口: void QProcess::start(const QString &program, const QStringList &arguments, OpenMo ...

  9. 多进程编程之守护进程Daemonize

    1.守护进程 守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务.很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭.另一些只在需要的时候才启动,完成任务后就自动结束. ...

  10. mysql中while循环以及变量声明以及dilimiter

    首先我们查看一个正确的完整的一个存储过程 ①其中delimiter命令解释如下:默认情况下,delimiter是分号:.在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令 ...