图的遍历

图的遍历

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

题解:

假设图联通,那么由于每次走两步,相当于在规定一个起点后只能走奇偶性相同的点,所以,对于每一个连通块,我们只需要01染色后,看一下有没有相同颜色连边的情况,如果有,那就说明奇偶性不同的点能够到达,也就是说,我们可以遍历整张图,如果没有,那么我们直接加一条即可,
然后如果图不连通,那么首先,我们最少要多加连通块-1条边,然后如果这些连通块中有一个出现相同颜色边的情况,那么我们的只有把图联通即可,否则,则需多加一条


代码

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;

int main(){
    //freopen("a.in", "r", stdin);

    int n,m,col[100010],vis[100010],flag=1;
    vector<int> G[100010];
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) {
        int u,v;scanf("%d%d",&u,&v);
        G[u].pb(v);G[v].pb(u);
    }

    function<void(int ,int)> dfs = [&] (int u,int cl) {
        col[u]=cl;vis[u]=1;
        for(int v:G[u]) {
            if(col[v]) {
                if(col[v]==cl) flag=0;
            }
            else dfs(v,3-cl);
        }
    };
    int t=0;

    for(int i=1;i<=n;i++) {
        if(!vis[i]) {
            dfs(i,1);
            t++;
        }
    }
    printf("%d\n",t-1+flag);

    return 0;
}

/*
8 8
1 2
2 3
3 4
4 2
5 6
6 7
7 8
8 6
*/
全部评论

相关推荐

菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
11-02 09:49
已编辑
货拉拉_测试(实习员工)
热爱生活的仰泳鲈鱼求你们别卷了:没事楼主,有反转查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务