CodeForces 860D Wizard's Tour
题意
给出一张无向图,要求找出尽量多的长度为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的更多相关文章
- 【Codeforces858F】Wizard's Tour [构造]
Wizard's Tour Time Limit: 50 Sec Memory Limit: 512 MB Description Input Output Sample Input 4 5 1 2 ...
- Wizard's Tour
F. Wizard's Tour time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Wizard's Tour CodeForces - 860D (图,构造)
大意: 给定$n$节点$m$条边无向图, 不保证连通, 求选出最多邻接边, 每条边最多选一次. 上界为$\lfloor\frac{m}{2}\rfloor$, $dfs$贪心划分显然可以达到上界. # ...
- Codeforces 666 B. World Tour
http://codeforces.com/problemset/problem/666/B 题意: 给定一张边权均为1的有向图,求四个不同的点A,B,C,D,使得dis[A][B]+dis[B][C ...
- 【Codeforces 1137C】Museums Tour
Codeforces 1137 C 题意:给一个有向图,一周有\(d\)天,每一个点在每一周的某些时刻会开放,现在可以在这个图上从\(1\)号点开始随意地走,问最多能走到多少个开放的点.一个点如果重复 ...
- Codeforces 543 B. World Tour
http://codeforces.com/problemset/problem/543/B 题意: 给定一张边权均为1的无向图. 问至多可以删除多少边,使得s1到t1的最短路不超过l1,s2到t2的 ...
- codeforces 667D D. World Tour(最短路)
题目链接: D. World Tour time limit per test 5 seconds memory limit per test 512 megabytes input standard ...
- CF858F Wizard's Tour 解题报告
题目描述 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次旅游,每次旅游可以任选一个点 \(x\) 作为起点,再走到一个 ...
- CF858F Wizard's Tour
也许更好的阅读体验 \(\mathcal{Description}\) 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次 ...
随机推荐
- 【整理总结】Visual Studio 扩展和更新
Add New File File Icons C# outline ClaudiaIDE Code alignment CodeMaid Indent Guides Inline Color Pic ...
- HDU 6086 Rikka with String
Rikka with String http://acm.hdu.edu.cn/showproblem.php?pid=6086 题意: 求一个长度为2L的,包含所给定的n的串,并且满足非对称. 分析 ...
- sqoop 数据迁移
sqoop 数据迁移 1 概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HIVE.H ...
- apache开启伪静态的方法 php篇
打开apache的配置文件httpd.conf 找到 #LoadModule rewrite_module modules/mod_rewrite.so 把前面#去掉.没有则添加,但必选独占一行,使a ...
- 创建Springmvc项目时,特殊拦截器失效情况的原因及解决办法
最近开发一个新项目时,搭建springmvc框架时,遇到一个拦截器失效的情况困扰了两天.现在解决,特此记录一下. 拦截器不生效的情况描述: 设置登录拦截的时候,首先登录接口肯定是不用拦截的.所以需要在 ...
- 我们一起学习WCF 第二篇WCF承载多个接口
前言:现在王大叔养了大批猪,赚了很多钱.但是最近发现养鸡也可以赚很多钱,他就像扩展业务开始养鸡.又过两年他发现市场对狗的需求量很大,他开始养狗.那么他改怎么做呢,不可能去修改猪住的地方把鸭子和狗放里面 ...
- asp.net core 2.2 根据PC端和移动端自动显示不同视图而不改变url地址
1.添加HttpRequest扩展方法 public static class RequestExtensions { //regex from http://detectmobilebrowsers ...
- EF6+MVC5之Oracleo数据库的CodeFirst方式实现
http://www.oracle.com/technetwork/topics/dotnet/whatsnew/index.htm http://www.knowsky.com/887470.htm ...
- Linux大全
Linux 基本指令介紹 一定要先學會的指令:ls, more, cd, pwd, rpm, ifconfig, find 登入與登出(開機與關機):telnet, login, exit, sh ...
- Oracle创建表管理表
--创建图书表 create table books_lib ( book_id ) primary key, --unique¬ null book_name ) not null ) ...