对于这一题,一个图如果能被跳两步走完
首先要图是联通的 即把连通块都连起来 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);
}

京公网安备 11010502036488号