图的遍历

图的遍历

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

前言:

这是一个很不错的思维题!

思路:

这个题就是要让我们来证明一幅图必须有奇数环,才能使得全图被遍历(假如按2步走的话).
首先我们对于一棵树来说,我们知道假如我们不走到叶子节点再还回肯定是没有意义的,但是其实我们走到叶子节点再还回也是没有意义的.
比方说我们现在有两条链,奇数链和偶数链.
奇数链:1->2,2->3.我们会发现走到叶子节点是没有意义的,无法改变他来时的点的位子.
偶数链:1->2,2->3,3->4.同样的,这里也是没有意义的,1->3,3->3.还是没改变.
好!接下来是偶数环.
偶数环:1->2,2->3,3->4,4->1.无论我们怎么走,来时哪个点,回来时也是哪个点.
但是,奇数环就不一样了~
它直接改变了奇偶性质.综上,我们就证明了.

代码:

用染色法判断奇数环即可.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
vector<int>g[N];
int deg[N],root=0;
int color[N]; 
int odd_circle=1;
void dfs(int u,int col)
{
    if(color[u]!=-1)
    {
        if(color[u]!=col)    odd_circle=0;
        return;
    }color[u]=col;
    for(int x:g[u])    dfs(x,1-col);
}

int main()
{
    memset(color,-1,sizeof color);
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v;scanf("%d%d",&u,&v);
        g[u].push_back(v);
        g[v].push_back(u);
    }int ans=-1;
    for(int i=1;i<=n;i++)
    {
        if(color[i]==-1)
        {
            dfs(i,1);ans++;
        }
    }ans+=odd_circle;
    printf("%d\n",ans);
    return 0;
}
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论

相关推荐

珩珺:那些经历都太大太空了,实习的情况不了解,大创项目连名字、背景、目的及意义都没体现出来;地摊经济更是看完连卖的什么产品都不知道,项目成果直接写营收多少都更直观真实一点;后面那个校文体部的更是工作内容是组织活动整理流程,成果变成了当志愿者,而且你们学校本科学生会大一入学就直接当部长吗,志愿里面还提到了疫情防控,全面解封是22年12月的事情,可能时间上也有冲突。可能你花了钱人家就用AI给你随便写了点内容改了一下,没什么体现个性化的点
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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