• SSLZYC 2415 连通块


    题目大意:

    这里写图片描述
    这里写图片描述
    这里写图片描述


    思路:
    并查集
    一开始以为是DFS,但是看到每次都要输出联通块的个数,就感觉不对。
    可以把相邻的同颜色的块看作同一祖先的块,用sum记录现在有多少个联通块。


    代码:

    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    int n,m,a[511][511],father[250101],x,y,sum,c;
    
    int find(int x)
    {
        return x==father[x]?x:father[x]=find(father[x]);
    }
    
    int l(int x,int y)
    {
        return (x-1)*n+y;
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n*n;i++) father[i]=i;
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&c,&x,&y);
            c++;
            sum++;  //联通块个数加一
            a[x][y]=c;  //记录颜色
            if (x>1&&a[x-1][y]==c&&father[find(l(x,y))]!=find(l(x-1,y))) 
             father[find(l(x,y))]=find(l(x-1,y)),sum--;  
            if (x<n&&a[x+1][y]==c&&father[find(l(x,y))]!=find(l(x+1,y))) 
             father[find(l(x,y))]=find(l(x+1,y)),sum--;
            if (y<m&&a[x][y+1]==c&&father[find(l(x,y))]!=find(l(x,y+1))) 
             father[find(l(x,y))]=find(l(x,y+1)),sum--;
            if (y>1&&a[x][y-1]==c&&father[find(l(x,y))]!=find(l(x,y-1))) 
             father[find(l(x,y))]=find(l(x,y-1)),sum--;  //向四周搜索联通块
            printf("%d\n",sum);
        }
        return 0;
    }
  • 相关阅读:
    并发编程(一) 操作系统基础和进程
    操作系统发展史
    网络编程(三) 大文件传输与UDP通信
    网络编程(二)-socket套接字
    网络编程(一)
    排序算法之冒泡法
    第二章 算法基础 思考题2-1
    查找算法之二分查找
    排序算法之归并排序
    排序算法之插入排序
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313066.html
Copyright © 2020-2023  润新知