SDUTOJ 2802--英语系列二【并查集】

来源:互联网 发布:js sleep函数 编辑:程序博客网 时间:2024/06/05 20:43

题目描述
昨天,小明期待已久的英语四六级出成绩了,不幸的是,小明没有及格。通过和自己的好友聊天,小明知道了很多好友的成绩。于是,无聊的小明自己划分了一些分数段,并统计自己的好友在每个分数段的人数(有些分数段只有一个人),他想知道人数最多的分数段有多少人。可是,小明数学不太好,你能帮一下他吗? 假设他有n名好友,好友编号为0~n-1。输入多组输入,每组第一行是两个整数n,m(2 <= n <= 10000, 0 <= m <=1000)。接下来m行,每行两个整数a,b(0 <= a,b <= n-1)。代表好友a和好友b在同一个分数段上。输出输出一行,输出人数最多的分数段有多少人。示例输入
4 21 22 36 30 12 32 4</span>

示例输出

33
模板题。。。
#include <stdio.h>int f[10001],h[10001];int find(int x){    int i,j,r;    r=x;    while(r!=f[r])        r=f[r];    i=x;    while(i!=r)    {        j=f[i];        f[i]=r;        i=j;    }    return r;}void merge(int x,int y){    int fx,fy;    fx=find(x);    fy=find(y);    if(fx!=fy)        f[fx]=fy;}int main(){    int n,m,a,b,c,d,i,k,max;    while(scanf("%d%d",&n,&m)!=EOF)    {for(i=0;i<n;i++)h[i]=0;        for(i=0;i<n;i++)            f[i]=i;        while(m--)        {            scanf("%d%d",&a,&b);            merge(a,b);        }d=0;k=0;for(c=0;c<n;c++){    h[find(c)]++;} max=h[0];for(i=1;i<n;i++)if(h[i]>max)max=h[i];printf("%d\n",max);    }    return 0;}


0 0
原创粉丝点击