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\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次 ...
随机推荐
- 20155328 2016-2017-2 《Java程序设计》 第一周学习总结
20155328 2016-2017-2 <Java程序设计> 第一周学习总结 教材学习内容总结 本周学习目标是浏览<Java学习笔记>中的十八章,其中第一章和第二章认真学习, ...
- 考研编程练习----最大公约数与最小公倍数(c语言)
int gcd(int a, int b){return (a = a % b) ? gcd (b,a): b;} int lcm(int a, int b){return a * b / gcd(a ...
- WPF 带刻度的滑动条实现
原文:WPF 带刻度的滑动条实现 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83507170 ...
- 06004_Redis的启动、使用和停止
1.Redis的启动 (1)前端模式启动 ①直接运行bin/redis-server将以前端模式启动:切换到 /usr/local/redis/bin目录下,然后./redis-server : ②前 ...
- Q&As:1.cocos2d-html5如何获得鼠标划过事件
不喜欢按部就班学东西,感觉各种框架各种技术就应该是拿到手用的,这应该是导致我现在学了这么多却没一样精通的缘故吧. 发现自己喜欢在QQ群回答一些菜鸟的问题,就算自己不清楚也会乐意看代码帮助解决╮(╯_╰ ...
- JavaWeb(十三)——使用Session防止表单重复提交
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...
- New Year_2019
新年目标 1. own的项目稳定高效,业务能满足业务方需求,功能质量超出业务方期待.2. 工作中成长,包括项目的需求管理,计划排期,整体的把控能力.3. 对公司的业务了解程度达到更高程度. 个人技能目 ...
- Wormholes POJ 3259(SPFA判负环)
Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...
- Java 学习笔记 ------第二章 从JDK到IDE
本章学习目标: 了解与设定PATH 了解与指定CLASSPATH 了解与指定SOURCEPATH 使用package与import管理类别 初步认识JDK与IDE的对应关系 一.第一个Java程序 工 ...
- c# 消息机制
1.windows系统是一个消息驱动的系统,windows本身有自己的消息队列. 系统传递消息给应用程序. 应用程序的消息机制:应用程序的执行是通过消息驱动的.消息是整个应用程序的工作引擎. 2.c# ...