首页 > 其他分享 >[ABC286G] Unique Walk 题解

[ABC286G] Unique Walk 题解

时间:2023-11-10 12:24:49浏览次数:44  
标签:连通 fx int 题解 fa ABC286G Unique find 欧拉

洛谷题目链接

At题目链接

这题一看就很欧拉路径,但是怎么做呢?

如果只有关键边,那么连通图首先会变成一堆连通块,这时只需要分别对每个连通块进行欧拉路径判断,但是对于不属于欧拉路径的连通块,很难对加上非关键边的情况进行扩展。

如果只有非关键边,那么连通图还是变成一堆连通块,但是这些连通块全部都是合法的,这样方便扩展。

如果一个关键边连接的两端点是一个连通块内的,那么这条关键边显然可以做到只经过一次,也就是在一个连通块内的关键边就不用考虑了;

那么剩下的关键边连接起来是一个无向连通图,此时做一遍裸的欧拉路径即可。

const int N=2e5+10;
int n,m,k;
int fa[N],vis[N],deg[N];
struct node {
	int l,r;
}a[N];

int find(int x) {
	if(x==fa[x]) return x;
	return fa[x]=find(fa[x]); 
}

void merge(int x,int y) {
	int fx=find(x),fy=find(y);
	if(fx!=fy) fa[fx]=fy;
}

int main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++) cin>>a[i].l>>a[i].r;
	cin>>k;
	for(int i=1;i<=k;i++) {
		int p; cin>>p; vis[p]=1;
	}
	for(int i=1;i<=m;i++) {
		if(!vis[i]) merge(a[i].l,a[i].r);
	}
	for(int i=1;i<=m;i++) {
		if(vis[i]) {
			int id1=find(a[i].l),id2=find(a[i].r);
			if(id1!=id2) {
				deg[id1]++; deg[id2]++;
			}
		}
	}
	int cnt=0; 
	for(int i=1;i<=n;i++) if(deg[i]%2!=0) cnt++;
	if(cnt==0||cnt==2) cout<<"Yes";
	else cout<<"No"; 
	
	return 0;
}

标签:连通,fx,int,题解,fa,ABC286G,Unique,find,欧拉
From: https://www.cnblogs.com/zhangyuzhe/p/17823818.html

相关文章

  • 题解 P4630 [APIO2018] 铁人两项
    具体思路题目问的是三元组\((x,z,y)\)使得\(x\)可以到达\(z\),且\(z\)可以到达\(y\),求三元组\((x,z,y)\)的数量。我们转化一下问题,就是问\(x,y\)之间所有不重复路径的点的并集减\(2\)。显然,无向图中任意一个点都属于一个点双连通分量。那么问题转化为\(x,y\)之......
  • [题解] P6773 [NOI2020] 命运
    P6773[NOI2020]命运给你一棵\(n\)个节点的树,要给每条边染成\(0\)或\(1\)。有\(m\)个限制\((u,v)\)满足\(u\)是\(v\)祖先,表示\(u\)到\(v\)的路径中至少有一条边被染成了1。求方案数。\(n,m\le5\times10^5\)。首先会想到容斥,但是很没前途,所以考虑......
  • P9194 [USACO23OPEN] Triples of Cows P 题解
    Description给定一棵初始有\(n\)个点的树。在第\(i\)天,这棵树的第\(i\)个点会被删除,所有与点\(i\)直接相连的点之间都会两两连上一条边。你需要在每次删点发生前,求出满足\((a,b)\)之间有边,\((b,c)\)之间有边且\(a\not=c\)的有序三元组\((a,b,c)\)对数。\(n\leq2......
  • [题解] CF938G Shortest Path Queries
    ShortestPathQueries给你一张无向连通图,支持三种操作:插入一条边\((u,v,w)\)。删除一条边。求\((u,v)\)之间的异或最短路。\(n,m,1<2^{30}\)。先考虑异或最短路怎么求,这部分和最大XOR和路径是一样的。就是把图上的环都扔到一个线性基里,每次查询就是线性基......
  • [题解] P5901 [IOI2009] Regions
    P5901[IOI2009]Regions给你一棵树,每个点有颜色\(h_i\)。多次询问,每次询问有多少对\((u,v)\)满足\(u\)是\(v\)的祖先且\(u\)的颜色是\(r_1\)且\(v\)的颜色是\(r_2\)。\(n,q\le2\times10^5,h_i\le2.5\times10^4\)。总颜色数一定,考虑对颜色的出现次......
  • [题解] CFgym103069G Prof. Pang's sequence
    G.Prof.Pang'ssequence给一个长度为\(n\)的序列\(a\),多次询问区间\([l,r]\)内有多少个子区间的颜色数是奇数。\(n,m\le10^5\)。先按照HH的项链的套路,对于每个数记一下\(lst_i\)表示\(a_i\)上一次出现的位置。然后扫描线,将所有子区间的答案转化成历史和。......
  • [CSP-J 2021] 小熊的果篮 题解
    题目链接既然只有两种东西,我们不妨分开考虑,这里也借鉴了很多二分图题目的切入点。假设苹果和桔子下标分别如下图所示:苹果:1367910桔子:2458那么第一次取,应该是这样取:1234689也就是先取开头比较小的,然后轮流取,注意一定保证递增,也就是对于苹果找出来的\(x\)......
  • [题解]CFgym103470E Paimon Segment Tree
    PaimonSegmentTree区间加,求一段时间内的区间平方和。\(n,m,q\le5\times10^4\)。对时间维差分一下,变成询问区间历史平方和。离线下来扫描线,扫描线维护时间维,数据结构维护序列维。考虑维护二元组\((a,s)\)表示当前位置值为\(a\),历史平方和为\(s\)。可以发现怎......
  • A2OJ Ladder 21 简要题解
    https://earthshakira.github.io/a2oj-clientside/server/Ladder21.html只记录Difficultylevel>=8的。有很多题是口胡的。写了的会标注提交记录。还有些很久以前写过的题就懒得搬提交记录了。71.CF444EDZYlovesplanting我们二分答案,然后可以这样转化:把权\(\ged\)的......
  • 题解:疯狂lcm
    %你赛打到一半来写个题解link:疯狂lcm题意,求:\[\sum_{i=1}^{n}lcm(i,n)\]不多说废话,直接开推:\[\begin{aligned}&=n\sum_{i=1}^{n}\frac{i}{gcd(i,n)}\\&=n\sum_{d\midn}\sum_{i=1}^{n}\frac{i}{d}[gcd(i,n)=d]\\&=n\sum_{d\midn}\sum_{i=1}^{n}......