题意

给出一张无向图,要求找出尽量多的长度为2的不同路径(边不可以重复使用,点可以重复使用)

分析

yzy:这是原题 http://www.lydsy.com/JudgeOnline/problem.php?id=4874

首先猜测,一个连通块内,如果是偶数条边,那么所有边都可以用上.如果是奇数条边,那么只会剩下一条边.只要给出一个方案构造的方法,那么正确性就可以从构造方法中得出.

长度为2的路径中中间那个点和两条边都有关.我们可以认为这两条边都属于中间那个点. 于是现在就变成把每条边分配给它的两个端点中的一个.显然,一个连通块最多只能有一个端点被分配奇数条边.

构造方法是这样的:从连通块里拎出一棵生成树,然后把非树边随便分配,接下来从叶节点往上,依次分配所有非树边,从下到上依次确保每个点都被分配了偶数条边.最后除了根节点之外的点一定都被分配了偶数条边,根节点被分配的边数奇偶性和连通块内总边数的奇偶性相同.

#include <cstdio>
#include <vector>
using namespace std;
const int maxn=200005;
struct edge{
int to,next,num;
}lst[maxn<<1];int len=1,first[maxn];
void addedge(int a,int b,int w){
lst[len].to=b;lst[len].next=first[a];lst[len].num=w;
first[a]=len++;
}
int u[maxn],v[maxn],typ[maxn];//typ[i]==0 belong to u[i]
int sum[maxn];
int ufs[maxn];
int find(int x){
return x==ufs[x]?x:ufs[x]=find(ufs[x]);
}
bool ontree[maxn];
void dfs(int x,int p){
for(int pt=first[x];pt;pt=lst[pt].next){
if(lst[pt].to!=p){
dfs(lst[pt].to,x);
if(sum[lst[pt].to]==0){
typ[lst[pt].num]=(v[lst[pt].num]==x);
sum[x]^=1;
}else{
typ[lst[pt].num]=(u[lst[pt].num]==x);
sum[lst[pt].to]=0;
}
}
}
}
vector<int> P[maxn];
int main(){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)scanf("%d%d",u+i,v+i);
for(int i=1;i<=n;++i)ufs[i]=i;
for(int i=1;i<=m;++i){
if(find(u[i])==find(v[i])){
typ[i]=0;sum[u[i]]^=1;
}else{
ufs[find(u[i])]=find(v[i]);
addedge(u[i],v[i],i);addedge(v[i],u[i],i);
}
}
for(int i=1;i<=n;++i){
if(ufs[i]==i)dfs(i,0);
}
for(int i=1;i<=m;++i){
if(typ[i]==0)P[u[i]].push_back(v[i]);
else P[v[i]].push_back(u[i]);
}
int ans=0;
for(int i=1;i<=n;++i){
ans=ans+P[i].size()/2;
} printf("%d\n",ans);
for(int i=1;i<=n;++i){
int sz=P[i].size();
for(int j=0;j+1<sz;j+=2){
printf("%d %d %d\n",P[i][j],i,P[i][j+1]);
}
}
return 0;
}

CodeForces 860D Wizard's Tour的更多相关文章

  1. 【Codeforces858F】Wizard's Tour [构造]

    Wizard's Tour Time Limit: 50 Sec  Memory Limit: 512 MB Description Input Output Sample Input 4 5 1 2 ...

  2. Wizard's Tour

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

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

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

  4. Codeforces 666 B. World Tour

    http://codeforces.com/problemset/problem/666/B 题意: 给定一张边权均为1的有向图,求四个不同的点A,B,C,D,使得dis[A][B]+dis[B][C ...

  5. 【Codeforces 1137C】Museums Tour

    Codeforces 1137 C 题意:给一个有向图,一周有\(d\)天,每一个点在每一周的某些时刻会开放,现在可以在这个图上从\(1\)号点开始随意地走,问最多能走到多少个开放的点.一个点如果重复 ...

  6. Codeforces 543 B. World Tour

    http://codeforces.com/problemset/problem/543/B 题意: 给定一张边权均为1的无向图. 问至多可以删除多少边,使得s1到t1的最短路不超过l1,s2到t2的 ...

  7. codeforces 667D D. World Tour(最短路)

    题目链接: D. World Tour time limit per test 5 seconds memory limit per test 512 megabytes input standard ...

  8. CF858F Wizard's Tour 解题报告

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

  9. CF858F Wizard's Tour

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

随机推荐

  1. WPF 任务栏颜色 - 简书

    原文:WPF 任务栏颜色 - 简书 先看看效果,这种效果可以用来做进度条或者消息通知闪烁.   image.png   image.png   image.png   image.png 有一个好消息 ...

  2. OpenCV中Mat操作clone() 与copyto()的区别

    OpenCV中Mat操作clone() 与copyto()的区别 // Mat is basically a class with two data parts: the matrix header ...

  3. 【LG4609】[FJOI2016]建筑师

    [LG4609][FJOI2016]建筑师 题面 洛谷 题解 (图片来源于网络) 我们将每个柱子和他右边的省略号看作一个集合 则图中共有\(a+b-2\)个集合 而原来的元素中有\(n-1\)个(除去 ...

  4. 深入浅出之-route命令实战使用指南

    本博文的视频讲解已发布:http://oldboy.blog.51cto.com/2561410/1119453 缘起:本文为老男孩linux培训第七次课前考试题及参考答案,有朋友在看完http:// ...

  5. Maven学习(七)-----Maven添加远程仓库

    Maven添加远程仓库 默认情况下,Maven从Maven中央仓库下载所有依赖关系.但是,有些库丢失在中央存储库,只有在Java.net或JBoss的储存库远程仓库中能找到. 1. Java.net资 ...

  6. 初识JMM

    目录 what is JMM? JMM变量存储结构 JMM三大特性 原子性 可见性 有序性 java 堆栈 静态存储 栈式存储 堆式存储 JVM是啥 参考<Inside JVM> what ...

  7. 2018百度之星开发者大赛-paddlepaddle学习(二)将数据保存为recordio文件并读取

    paddlepaddle将数据保存为recordio文件并读取 因为有时候一次性将数据加载到内存中有可能太大,所以我们可以选择将数据转换成标准格式recordio文件并读取供我们的网络利用,接下来记录 ...

  8. Unity Lighting - Light Probes 光照探针(十)

      Light Probes 光照探针 Only static objects are considered by Unity’s Baked or Precomputed Realtime GI s ...

  9. (python)剑指Offer 面试题51:数组中重复的数字

    问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...

  10. Switch Game :因子数

    A - Switch Game Problem Description There are many lamps in a line. All of them are off at first. A ...