对于这一题,一个图如果能被跳两步走完
首先要图是联通的 即把连通块都连起来 ans=连通块数-1;
在然后,如果这个图有奇数环的话 我们走两个循环就可以把图都走到
如果没有的话 就加一条边形成奇数环 ans+=flag;
答案就出来了

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int const N=2e5+5;
int n,tot,du[N],head[N],nex[N<<1],to[N<<1],vis[N];///链式前向星
void add(int u,int v){to[++tot]=v;nex[tot]=head[u];head[u]=tot;}

void  dfs(int u,int x)
{
     vis[u]=x;
     for(int j=head[u];j;j=nex[j])///遍历i起点的每一条边
     {
                int v=to[j];///连接的点
                if(!vis[v]) 
                {
                    dfs(v,x*-1);
                }
                if(vis[v]==x) flag=0;///有奇数环
     }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v;scanf("%d%d",&u,&v);
        add(u,v);add(v,u);

    }
    int ans=0,flag=1;
    for(int i=1;i<=n;i++)
    {
        ans++;
        if(vis[i]==0)///没到过 新联通块
        {
           dfs(i,1);
        }
    }
    printf("%d\n",ans-1+flag);
}