加边的无向图

加边的无向图

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

问加几条边可以使图中的点两两到达就是使图成为连通图
也就是说所有点的根节点都指向一个点,p[i]是i的根节点,所以当p[i]==i时候,ans可以++。

并查集找连通块的个数,ans是连通块个数减去1

#include <cstdio>

const int maxn=1e5+5;
int n,m;
int p[maxn];

void init()
{
    for(int i=1;i<=n;i++)
    {
        p[i]=i;
    }
}

int find(int x)
{
    if(p[x]!=x)
    p[x]=find(p[x]);

    return p[x];

}

void unionn(int x,int y)
{
    int p1=find(x);
    int p2=find(y);

    if(p1!=p2)
    {
        p[p1]=p2;
    }
}

int main()
{
    scanf("%d %d",&n,&m);
    init();
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        unionn(x,y);
    }

    int ans=0;

    for(int i=1;i<=n;i++)
    {
        if(find(i)==i)
        ans++;
    }
    ans--;
    printf("%d\n",ans);

    return 0;
}
全部评论

相关推荐

皮格吉:不,有的厂子面试无手撕,可以试试。都是一边学一边面。哪有真正准备好的时候,别放弃
无实习如何秋招上岸
点赞 评论 收藏
分享
迷茫的大四🐶:看来已经准备换人了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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