并查集求优化!第一次接触,请大家指点!
  • 板块P1141 01迷宫
  • 楼主lxy_1017
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/25 19:00
  • 上次更新2023/10/27 05:55:47
查看原帖
并查集求优化!第一次接触,请大家指点!
826176
lxy_1017楼主2022/10/25 19:00
#include <iostream>
#include<iomanip>
#include<string>
using namespace std;
long long fx[100000],i,j,m,n,x,y;
int suo(int a)
{
    if(fx[a]==a)return a;
    return fx[a]=suo(fx[a]); 
}
void hh(int x,int y)
{
    int gg = suo(x);
    int mm = suo(y);
    fx[max(gg,mm)]=min(gg,mm);
}
int main()
{
    cin>>n>>m;
    int arr[n*n+1];
    string s;
    for(i = 0;i<n;i++)
    {
        
        cin>>s;
        for(j = 1;j<=n;j++)
        {
        arr[i*n+j]=s[j-1]-48;
        fx[i*n+j]=i*n+j;
        }
        s = " ";
    }
    for(i = 0;i<n;i++)
    {
        for(j = 1;j<=n;j++)
        {
            long long g = i*n+j;

            if(j!=1)
            {
                if(arr[g]!=arr[g-1])
                {
                    hh(g,g-1);
                }}
            if(j!=n)
                {if(arr[g]!=arr[g+1])
                {
                    hh(g+1,g);
                }}
            if(i!=n-1)
              {if(arr[g]!=arr[g+n])
                {
                    hh(g+n,g);
                }
                }
                if(i!=0)
                {
                if(arr[g]!=arr[g-n])
                {
                    hh(g,g-n);
                }}
        }
    }
    long long t = 0;
    int uu[m];
    for(t = 1;t<=m;t++)
    {   uu[t]=0;
        cin>>x>>y;
        for(i = 0;i<n;i++)
    {
        long long yu = n*(x-1)+y;
        for(j = 1;j<=n;j++)
        {
            long long g  = n*i+j;
            if(fx[g]==fx[yu])
            uu[t]++;
    }
    }
    }
    for(t = 1;t<=m;t++)
    {
        cout<<uu[t]<<endl;
    }
}
2022/10/25 19:00
加载中...