HDU 1856 More is better

这题。。刚开始看那个数字有点大,以为开不了那么大的数组(其实只有一千万,可以开,,被眼睛给欺骗了。。),结果用了一些容器来优化,结果发现所谓的“优化”过后时间花费还更多了,多了一倍, 虽然空间复杂度提高了10倍。。真是。果然是一个时间复杂度换空间复杂度的活生生的案例啊。。

这题给我的收获:

1.10000000的数组可以开。

2.合并时,if(x == y) return; 最好加上,否则突然浪费时间,还有可能超时。

代码:( 直接开数组版 78672KB  406ms )

#include<stdio.h>
int fa[10000001],rank[10000001];
int findset(int x)
{
    if(x != fa[x])
        fa[x] = findset(fa[x]);
    return fa[x];
}
void unionset(int x,int y)
{
    x=findset(x);
    y=findset(y);
    if(x==y)
        return;
    if(rank[x] >= rank[y])
    {
        fa[y] = x;
        rank[x] += rank[y];
    }
    else if(rank[x] < rank[y])
    {
        fa[x] = y;
        rank[y] += rank[x];
    }
}
int main()
{
    int n,i,j,maxi,a,b;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<10000000;i++)
        {
            fa[i]=i;
            rank[i]=1;
        }
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&a,&b);
            unionset(a,b);
        }
        maxi=rank[0];
        for(i=1;i<10000000;i++)
            if(maxi<rank[i])
                maxi=rank[i];
        printf("%d
",maxi);
    }
    return 0;
}
View Code

代码:( 容器优化版  7576KB  890ms )

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <utility>
#include <cstdlib>
using namespace std;
#define N 100100

map<int,int> fa,num;
vector<int> v,v2;

struct node
{
    int a,b;
}pa[N];

void makeset()
{
    fa[v[0]] = v[0];
    num[v[0]] = 1;
    v2.push_back(v[0]);
    for(int i=1;i<v.size();i++)
    {
        if(v[i] != v[i-1])
        {
            v2.push_back(v[i]);
            fa[v[i]] = v[i];
            num[v[i]] = 1;
        }
    }
}

int findset(int x)
{
    if(x != fa[x])
    {
        fa[x] = findset(fa[x]);
    }
    return fa[x];
}

void unionset(int a,int b)
{
    int x = findset(a);
    int y = findset(b);
    if(x == y)
        return;
    if(num[x] >= num[y])
    {
        fa[y] = x;
        num[x] += num[y];
    }
    else
    {
        fa[x] = y;
        num[y] += num[x];
    }
}

int main()
{
    int n,i;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&pa[i].a,&pa[i].b);
            v.push_back(pa[i].a);
            v.push_back(pa[i].b);
        }
        sort(v.begin(),v.end());
        makeset();
        for(i=1;i<=n;i++)
        {
            unionset(pa[i].a,pa[i].b);
        }
        int maxi = -1000000;
        for(i=0;i<=v2.size();i++)
        {
            if(fa[v2[i]] == v2[i])
            {
                if(num[v2[i]] > maxi)
                    maxi = num[v2[i]];
            }
        }
        printf("%d
",maxi);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/whatbeg/p/3508456.html