hdu 1856

题目

并查集。

找到最大出现的那个点。

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

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

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

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

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

代码如下:

#include
using namespace std;
#include

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<


你可能感兴趣的:(ACM-数据结构,并查集)