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\n",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\n",maxi);

    }

    return 0;

}
View Code

 

你可能感兴趣的:(more)