并查集

POJ 2524 Ubiquitous Religions

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,maxnum;
int father[50005],num[50005];
void makeset(int n)//创建并查集
{
    for(int i=0;i<=n;i++){
        father[i]=i;//每个元素的father为自身
        num[i]=1;//每类均只有一个
    }
}
int findset(int x)
{
    if(father[x]!=x){
        father[x]=findset(father[x]);
    }
    return father[x];
}

void Union(int a,int b)
{
    int x=findset(a);
    int y=findset(b);
    if(x==y) return;
    if(num[x]<=num[y]){
        father[x]=y;
        num[y]+=num[x];
        maxnum--;
    }
    else{
        father[y]=x;
        num[x]+=num[y];
        maxnum--;
    }
}
int main()
{
    int Case=1;
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n==0&&m==0) break;
        maxnum=n;
        makeset(n);
        int a,b;
        for(int i=0;i<m;i++){
            scanf("%d%d",&a,&b);
            Union(a,b);
        }
        printf("Case %d: %d\n",Case++,maxnum);
    }
    return 0;
}

HOJ 1225 - Supermarket

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int h[10001];
struct product
{
    int p,d;
    bool operator < (const product &a){
       return a.p < p;
    }
}pd[10001];
inline int find(int x)
{//并查集查找 递归的路径压缩
    if (h[x]==x) return x;
    h[x]=find(h[x]);
    return h[x];
}
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        int ans=0;
        int md=0;//记录最大截止时间
        for (int i=1;i<=n;i++)
        {
            scanf("%d %d",&pd[i].p,&pd[i].d);
            if (md<pd[i].d) md=pd[i].d;
        }
        sort(pd+1,pd+n+1);//完全按价值从大到小排序,不考虑时间
        for (int i=0;i<=md;i++)
            h[i]=i;//初始化并查集,每个时间的最近空闲时间都是其本身
        //h[i]表示第i个单位时间内向前最近[保证尽量迟]是哪一个单位时间有空余
        for (int i=1;i<=n;i++){
            if (find(pd[i].d))
            {
                ans+=pd[i].p;
                h[h[pd[i].d]]=h[pd[i].d]-1;
                //将当前时间的最近空闲时间置为h[pd[i].d]-1
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

HOJ 1564 - The Suspects

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int h[30001];
int temp[30001];
int findset(int x)
{
    if(h[x]!=x){
        h[x]=findset(h[x]);
    }
    return h[x];
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n==0&&m==0) break;
        for(int i=0;i<n;i++){
           h[i]=i;
        }
        while(m--){
            int k;
            scanf("%d",&k);
            int mi=n;
            for(int i=0;i<k;i++){
                int x;
                scanf("%d",&x);
                temp[i]=findset(x);
                if(temp[i]<mi){
                    mi=temp[i];
                }
            }
            for(int i=0;i<k;i++){
                h[temp[i]]=mi;
            }
        }
        int num=0;
        for(int i=0;i<n;i++){
            if(findset(i)==0){
                num++;
            }
        }
        printf("%d\n",num);
    }
    return 0;
}

HOJ 1642 - Corporative Network

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int father[20001],dis[20001];
inline int abs(int x){
    return x>0?x:-x;
}
int findset(int x)
{
    if(father[x]==x) return x;
    findset(father[x]);//更新沿途节点的距离值
    dis[x]+=dis[father[x]];
    father[x]=findset(father[x]);//路径上元素的父亲指针都指向根结点(路径压缩)
    return father[x];
}

void unionset(int x,int y){
    dis[x]=abs(x-y)%1000;
    father[x]=y;
}
int main() {
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        memset(dis, 0, sizeof(dis));
        scanf("%d",&n);
         for(int i=1;i<=n;i++){
            father[i]=i;
        }
        char op;
        while(scanf("%c",&op)&&op!='O'){
            if(op=='I'){
                int a,b;
                scanf("%d%d",&a,&b);
                unionset(a,b);
            }
            else if(op=='E'){
                int ans;
                scanf("%d",&ans);
                findset(ans);
                printf("%d\n",dis[ans]);
            }
        }
    }
    return 0;
}
乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值