HDU__A - How Many Tables(第一天)

来源:互联网 发布:linux 获取系统时区 编辑:程序博客网 时间:2024/04/23 22:56

// 姿态1,:记录每个根结点子结点数

<span style="font-size:14px;">#include<stdio.h>const int Max=1000;int tab[Max+10];int total[Max+10];int find(int a){    if(tab[a]!=a)        tab[a]=find(tab[a]);    return tab[a];}void Merge(int a,int b){    int fx=find(a);    int fy=find(b);    if(fx==fy)        return;    tab[fx]=fy;    total[fy]+=total[fx];    total[fx]=1;}int main(){    int T;    while(scanf("%d",&T)!=EOF){        for(int h=0;h<T;h++){            int M,N;            int sum=0,t,t1,cnt=0;            scanf("%d%d",&N,&M);            for(int i=0;i<N;i++){               tab[i]=i;               total[i]=1;            }            for(int i=0;i<M;i++){               int h,s;               scanf("%d%d",&h,&s);               Merge((h-1),(s-1));            }            for(int i=0;i<N;i++)                printf("%d ",tab[i]);            printf("\n");            for(int i=0;i<N;i++)                printf("%d ",total[i]);            printf("\n");            for(int i=0;i<N;i++){               if(total[i]!=1){                  sum+=total[i];                  cnt++;               }            }            t=N-sum+cnt;            printf("%d\n",t);        }    }}</span>

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<span style="font-size:14px;"><span style="background-color: rgb(240, 240, 240);">// 姿势2:初始化 集合个数,merge成功后-1</span></span>
<span style="font-size:14px;">#include<stdio.h>const int Max=1000;int tab[Max+10];int find(int a){    if(tab[a]!=a)        tab[a]=find(tab[a]);    return tab[a];}int main(){    int T;    while(scanf("%d",&T)!=EOF){        for(int h=0;h<T;h++){            int M,N;            scanf("%d%d",&N,&M);            int groups=N;            for(int i=0;i<N;i++)               tab[i]=i;            for(int i=0;i<M;i++){               int h,s;               scanf("%d%d",&h,&s);               int fx=find(h-1);               int fy=find(s-1);               if(fx!=fy){                  tab[fx]=fy;                  groups--;               }            }            printf("%d\n",groups);        }    }}</span>


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<span style="font-size:14px;">//姿势3:求根节点的个数,就是集合个数</span>
<span style="font-size:14px;">#include<stdio.h>const int Max=1000;int tab[Max+10];int find(int a){    if(tab[a]!=a)        tab[a]=find(tab[a]);    return tab[a];}void Merge(int a,int b){    int fx=find(a);    int fy=find(b);    if(fx==fy)        return;    tab[fx]=fy;}int main(){    int T;    while(scanf("%d",&T)!=EOF){        for(int h=0;h<T;h++){            int M,N;            int cnt=0;            scanf("%d%d",&N,&M);            for(int i=0;i<N;i++)               tab[i]=i;            for(int i=0;i<M;i++){               int h,s;               scanf("%d%d",&h,&s);               Merge((h-1),(s-1));            }            for(int i=0;i<N;i++){               if(tab[i]==i){                  cnt++;               }            }            printf("%d\n",cnt);        }    }}</span>




0 0
原创粉丝点击