#749 (div1+div2) E. Moment of Bloom(生成树,欧拉回路)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#749 (div1+div2) E. Moment of Bloom(生成树,欧拉回路)相关的知识,希望对你有一定的参考价值。
考虑 u u u点在 q q q次询问中出现次数为奇数次
那必定无法使所有边经过偶数次,因为 u u u的邻边被经过了奇数次,邻边就必然有一条边被经过奇数次
考虑所有点在 q q q次询问中都出现了偶数次,那么建一颗生成树
我们断言,对于询问 u , v u,v u,v只需从 u u u在树上走到 v v v即可满足最后每条边经过偶数次
考虑构造一张新图,对于询问 ( u , v ) (u,v) (u,v)在新图上由点 u u u向点 v v v连一条边
这样新图形成若干个连通分量,考虑每个连通分量的度数都是偶数
这么这个连通分量必定存在欧拉回路,从起点出发必定回到终点
所以在新图的欧拉回路的路径上由 u u u走到 v v v,对应的就在生成树上从 u u u走到 v v v
最后返回起始点的时候,因为是在树上走,所以相当于抵消了之前走的所有奇数边
所以这么构造是合法的.
于是当询问的点不全为偶数时,我们记录奇数点的个数 x x x,显然需要添加 x 2 \\frac{x}{2} 2x个询问让这些点的度数变为偶数
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int n,m,fa[maxn],L[maxn],R[maxn],in[maxn],vis[maxn],pre[maxn];
vector<int>vec[maxn],fg;
int find(int x){ return x==fa[x]?x:fa[x] = find( fa[x] );}
void dfs(int u,int s,int shu)
{
if( u==s ) cout << shu << endl << u << " ";
else
{
dfs( pre[u],s,shu+1 );
cout << u << " ";
}
}
void bfs(int s,int t)
{
for(int i=1;i<=n;i++) vis[i] = 0;
queue<int>q; q.push( s );
while( !q.empty() )
{
int u = q.front(); q.pop();
if( u==t )
{
dfs( t,s,1 ); cout << endl;
return;
}
for(auto v:vec[u] )
{
if( vis[v] ) continue;
vis[v] = 1, pre[v] = u, q.push( v );
}
}
}
signed main()
{
cin >> n >> m;
for(int i=1;i<=n;i++) fa[i] = i;
for(int i=1;i<=m;i++)
{
int l,r; cin >> l >> r;
int fl = find( l ), fr = find( r );
if( fl==fr ) continue;
vec[l].push_back( r ); vec[r].push_back( l );
fa[fl] = fr;
}
int q; cin >> q;
for(int i=1;i<=q;i++)
{
cin >> L[i] >> R[i];
in[L[i]]++; in[R[i]]++;
}
for(int i=1;i<=n;i++)
if( in[i]&1 ) fg.push_back( i );
if( fg.size() ) cout << "NO\\n" << fg.size()/2;
else
{
cout << "YES\\n";
for(int i=1;i<=q;i++) bfs( L[i],R[i] );
}
}
以上是关于#749 (div1+div2) E. Moment of Bloom(生成树,欧拉回路)的主要内容,如果未能解决你的问题,请参考以下文章
springboot页面部分刷新,比如同一个html页面的div1,div2,div1中放查询条件?
CodeForces875C[拓扑排序] Codeforces Round #440 [DIV2E/DIV1C]
codeforces round#509(div2) E. Tree Reconstruction
css/javascript 一个div包含两个样式class="div1 div2"用javascript修改其中一个样式的内容