问题 J: 传送机 (欧拉回路)

题意:

给出N个点,M条边,然后一条边只能走一次,无路可走可以跳转一下,问你最少跳转次数?

思路:

先看每个点的特点,偶数度的点,一定不可能是起点,因为他进去后还有出去的边,奇数度的边就一定是起点的边了.
对于每个连通块,我们能够知道,只需要再连上max((奇点个数 - 2) / 2,0)条边即可使得成为欧拉回路


ll f(ll x){
	if(a[x]==x) return x;
	return a[x]=f(a[x]);
}

void solve()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		a[i]=i;
	}
	scanf("%lld",&m);
	if(m==0){
		 puts("0");
		 return ;
	}
	
	for(int i=1;i<=m;i++){
		ll x,y;
		scanf("%lld%lld",&x,&y);
		in[x]++;
		in[y]++;
		ll fx=f(x);
		ll fy=f(y);
		if(fx==fy) continue;
		else a[fy]=fx;
	}
	for(int i=1;i<=n;i++){
		out[f(i)]+=in[i]%2;
	}
	ll ans=0;
	for(int i=1;i<=n;i++){
		if(in[i]>0&&f(i)==i) {
			ans += 1+max(0ll,(out[i]-2)/2);
		}
	}
	printf("%lld",ans-1);
}
posted @ 2021-07-23 19:31  `KingZhang`  阅读(51)  评论(0)    收藏  举报