POJ 1456 Supermarket【并查集】

题意: 有N件商品,知道了商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天时间,求出最大利润。

分析:利用并查集按利润排序,建立一个关于时间的并查集

         每次插入一个物品时,若该物品时间为 i,找出find(i),记为t,若t不为0,则将该物品安排到t这个时间完成,并使f[t]=t-1 亦即对于每个物品尽量

         安排在后边完成,安排后将fa指针前移,表示这个时间已经被占用,下次需要插入到它之前。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define clr(x)memset(x,0,sizeof(x))
using namespace std;
#define maxn 10010
int f[maxn];
struct node
{
    int w,end;
}q[maxn];
bool operator < (const node& a,const node& b)
{
    return a.w>b.w;
}
int find(int x)
{
    return f[x]==x?x:(f[x]=find(f[x]));
}
int main()
{
    int n,r,res,i;
    while(scanf("%d",&n)!=EOF)
    {
        res=0;
        for(i=0;i<maxn;i++)
            f[i]=i;
        for(i=0;i<n;i++)
            scanf("%d%d",&q[i].w,&q[i].end);
        sort(q,q+n);
        for(i=0;i<n;i++)
        {
            r=find(q[i].end);
            if(r>0)
            {
                f[r]=r-1;
                res+=q[i].w;
            }
        }
        printf("%d\n",res);
    }
    return 0;
}

 

posted @ 2012-08-25 00:02  'wind  阅读(818)  评论(0编辑  收藏  举报