AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

2025.5.5 学习笔记(并查集)

作者: 作者的头像   jwh ,  2025-05-07 15:19:33 · 安徽 ,  所有人可见 ,  阅读 3


0


第一题:
网络2

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define PII pair<int,int>
const int N=1e6+5;
int n,m;
int p[100010];
int ans;
int find(int x)
{
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        p[i]=i;
    }
    ans=n;
    while(m--)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        if(find(a)!=find(b))
        {
            ans--;
            p[find(a)]=find(b);
        }
        else p[find(a)]=find(b);
    }
    cout<<ans<<endl;
    return 0;
}

第二题: 围棋1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define PII pair<int,int>
const int N=1e6+5;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int n;
struct node
{
    int x;
    int y;
};
struct node p[100010];
map<pair<int,int>,int> ma;
int f[100010];
int st[20][20];
int ans;
int find(int x)
{
    if(f[x]!=x) f[x]=find(f[x]);
    return f[x];
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int c,x,y;
        scanf("%d %d %d",&c,&x,&y);
        ans++;
        p[i].x=x;
        p[i].y=y;
        st[x][y]=c;
        f[i]=i;
        ma[{x,y}]=i;
    }
    for(int i=1;i<=n;i++)
    {
        int x=p[i].x;
        int y=p[i].y;
        for(int j=0;j<4;j++)
        {
            int xx=x+dx[j];
            int yy=y+dy[j];
            if(st[xx][yy]==st[x][y]&&find(ma[{x,y}])!=find(ma[{xx,yy}]))
            {
                f[find(ma[{x,y}])]=find(ma[{xx,yy}]);
                ans--;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

第三题: ttime

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define PII pair<int,int>
const int N=1e6+5;
int n,m,q;
int p[1010];
int find(int x)
{
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++) p[i]=i;
    while(m--)
    {
        int a,b;
        cin>>a>>b;
        if(find(a)!=find(b))
        {
            p[find(a)]=find(b);
        }
    }
    while(q--)
    {
        int a,b;
        cin>>a>>b;
        if(find(a)==find(b)) cout<<"Y"<<endl;
        else cout<<"N"<<endl;
    }
    return 0;
}

第四题: 朋 友 (friend)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define PII pair<int,int>
const int N=1e6+5;
int n,m;
int p[30010];
int d[30010];
int ans;
int find(int x)
{
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        p[i]=i;
        d[i]=1;
    }
    while(m--)
    {
        int a,b;
        cin>>a>>b;
        if(find(a)!=find(b))
        {
            d[find(b)]+=d[find(a)];
            p[find(a)]=find(b);
            ans=max(ans,d[find(b)]);
        }
    }
    cout<<ans<<endl;
    return 0;
}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息