求条,玄一关46pts AC1、2、3,9,11
  • 板块P2170 选学霸
  • 楼主HeJietao
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/3 22:30
  • 上次更新2024/10/4 09:26:17
查看原帖
求条,玄一关46pts AC1、2、3,9,11
1016673
HeJietao楼主2024/10/3 22:30
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,k,stu1,stu2;
int father[20005],size[20005],st[20005];
int f;
void build(int n){
    for(int i=1;i<=n;i++){
        father[i]=i;
        size[i]=1;
    }
}
int find(int i){
    int size_f=0;
    while(i!=father[i]){
        st[size_f++]=i;
        i=father[i];
    }
    while(size_f){
        father[st[--size_f]]=i;
    }
    return i;
}
void Union(int x,int y){
    int fx=find(x),fy=find(y);
    if(fx!=fy){
        if(size[fx]>=size[fy]){
            father[fy]=fx;
            size[fx]+=size[fy];
        }
        else{
            father[fx]=fy;
            size[fy]+=size[fx];
        }
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    if(k==0){
    	printf("%d\n",m);
    	return 0;
	}
    build(n);
    for(int i=1;i<=k;i++){
        scanf("%d%d",&stu1,&stu2);
        Union(stu1,stu2);
    }
    f=size[find(1)];
    for(int i=1;i<=n;i++){
        if(abs(size[find(i)]-m)<f-m){
            f=size[find(i)];
        }
        else{
            if(abs(size[find(i)]-m)==f-m){
                if(size[find(i)]-m<=0){
                    f=size[find(i)];
                }
            }
        }
    }
    printf("%d\n",f);
    return 0;
}

纪录

错哪了QAQ

2024/10/3 22:30
加载中...