问题 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);
}

浙公网安备 33010602011771号