图的遍历【每日一题】

图的遍历

https://ac.nowcoder.com/acm/problem/52275

代码思想:
设答案为ans,很显然想要遍历完整个图,这个图必须联通,所以要添加(联通分量数-1)条边,先令ans=连通分量数-1。再考虑走两步这个性质,若一个图存在奇数环,那么这个图自然就能全部走到,因此DFS判断图内是否存在奇数环,若不存在再令ans++,最后输出ans即可。
时间复杂度:O(n+m)。
代码部分:

#include<bits/stdc++.h>
using namespace std;

vector<int>R[100005];
bool F=0,V[100005]={0},S[100005];
void DFS(int x)
{
    int i,j;
    for(i=0;i<R[x].size();i++)
    {
        j=R[x][i];
        if(!V[j])V[j]=1,S[j]=!S[x],DFS(j);
        else if(S[x]==S[j])F=1;
    }
}
int main()
{
    int i,j,ans=0,n,m;
    scanf("%d%d",&n,&m);
    while(m--)
    {
        scanf("%d%d",&i,&j);
        R[i].push_back(j),R[j].push_back(i);
    }
    for(i=1;i<=n;i++)if(!V[i])ans++,V[i]=S[i]=1,DFS(i);
    printf("%d\n",ans-F);
}
全部评论

相关推荐

06-13 10:15
门头沟学院 Java
想去夏威夷的大西瓜在午休:我也是27届,但是我现在研一下了啥项目都没有呀咋办,哎,简历不知道咋写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务