hdu 1856

来源:互联网 发布:网络电影心机主播 编辑:程序博客网 时间:2024/05/17 03:01

题目

并查集。

找到最大出现的那个点。

对于每一个线段使得其权值加1

最后统计根节点的权值最大的就是答案

当n=0是,答案是1.特殊数据特判,否则wa

另外并查集的查找操作,若按其他方式写的话,即超时。

最后各种bug的加速情况下46msAC

代码如下:

#include<iostream>using namespace std;#include<cstdio>const int maxn=10000010;const int N=100010;int pre[maxn],val[maxn];int a[N],b[N];inline int input()  {      char c;      int ret=0;      c=getchar();      while(c<'0'||c>'9') c=getchar();      while(c>='0'&&c<='9') ret=ret*10+c-'0',c=getchar();      return ret;  }  inline int find(int x){    if(pre[x]!=x)       pre[x]=find(pre[x]);    return pre[x];}inline void Union(int x,int y){    int fx=find(x);    int fy=find(y);    if(fx!=fy){       pre[fy]=fx;       val[fx]+=val[fy];    }}inline void init(int n){    for(int i=1;i<=n;i++)    {        pre[i]=i;        val[i]=1;    }}int main(){    int n,ans,mx;    while(~scanf("%d",&n)){        if(n==0) printf("1\n");        else{        mx=0;ans=1;        for(int i=1;i<=n;i++){            a[i]=input();b[i]=input();            mx=max(a[i],mx);            mx=max(b[i],mx);        }        init(mx);        for(int i=1;i<=n;i++){            Union(a[i],b[i]);        }        for(int i=1;i<=mx;i++){            if(pre[i]==i)              ans=max(ans,val[i]);        }        cout<<ans<<endl;    }    }    return 0;}