博文

并查集的应用PKU1703(2008-08-21 13:13:00)

摘要://///////////////////////////////////////
//作品名称:并查集应用
//作者姓名:满天飞
//作品时间:2008-8-15
//最后修改:2008-8-15
//Q Q 号码:280282813
//版权所有,翻版必究
/////////////////////////////////////////


#include<stdio.h>
#define MAX 100010
int ary[MAX];
int opt[MAX];
void Init(int n)
{
    int i;
    for(i = 0; i <= n+10; ++i)
    {
        ary[i] = -1;
        opt[i] = -1;
    }
}

int Find(int index)
{
    if(ary[index] < 0)
        return index;
    return ary[index] = Find(ary[index]);
}
int Union(int first, int second)
{
    int i, j;
    if(second == -1)
        return first;

    i = Find(first);
    j = Find(second);

阅读全文(3312) | 评论:0

并查集的应用PKU2524(2008-08-21 13:12:00)

摘要://///////////////////////////////////////
//作品名称:并查集应用
//作者姓名:满天飞
//作品时间:2008-8-15
//最后修改:2008-8-15
//Q Q 号码:280282813
//版权所有,翻版必究
/////////////////////////////////////////

#include<iostream>
using namespace std;
class Set
{
    private:
        int* ary;
        int length;
    public:
        int Find(int index);
        bool Union(int first, int second);
        Set(int n);
        int Count();
        virtual ~Set(){delete[]ary;}
};
int Set::Count()
{
    int i, ct;
    ct = 0;
    for(i = 1; i <= length; ++i)
    {
        if(ary[i] < 0)
    ......

阅读全文(2472) | 评论:0

并查集的应用PKU2492(2008-08-21 13:11:00)

摘要://///////////////////////////////////////
//作品名称:并查集应用
//作者姓名:梁岳传
//作品时间:2008-8-15
//最后修改:2008-8-15
//Q Q 号码:280282813
//版权所有,翻版必究
/////////////////////////////////////////

#include<iostream>
using namespace std;
#define MAX 1000010
int ary[MAX];
int opt[MAX];
void Init(int n)
{
    int i;
    for(i = 0; i <= n+10; ++i)
    {
        ary[i] = -1;
        opt[i] = -1;
    }
}
int Find(int index)
{
    if(ary[index] < 0)
        return index;
    return ary[index] = Find(ary[index]);
}
int Union(int first, int second)
{
    int i, j;
    if(second == -1)
        return first;

    i = Find(first);
    j ......

阅读全文(2206) | 评论:0

并查集的应用PKU2236(2008-08-21 13:10:00)

摘要://///////////////////////////////////////
//作品名称:并查集应用
//作者姓名:梁岳传
//作品时间:2008-8-16
//最后修改:2008-8-16
//Q Q 号码:280282813
//版权所有,翻版必究
////////////////////////////////////////

#include<iostream>
#include<cmath>
using namespace std;
typedef struct
{
    int x;
    int y;
    int parent;
}Node;
class Set
{
    public:
        Node* ary;
        int length;
    public:
        int Find(int index);
        bool Union(int first, int second);
        Set(int n);
        virtual ~Set(){delete[]ary;}
};

Set::Set(int n)
{
    int i;
    ary = new Node[n+10];
    length = n;
   ......

阅读全文(2018) | 评论:0

线段树的应用PKU2985(2008-08-21 13:00:00)

摘要://///////////////////////////////////////
//作品名称:并查集及线段树应用
//作者姓名:满天飞
//作品时间:2008-8-18
//最后修改:2008-8-18
//Q Q 号码:280282813
//版权所有,翻版必究
////////////////////////////////////////
//写得要死终于过了
#include<iostream>
using namespace std;
typedef struct
{
    int lbound;   //左界
    int rbound;   //右界
    int left;   //左子树
    int right;   //右子树
    int ct;    //覆盖次数
}TreeNode;
class SegmentTree
{
    private:
        int nodenum;
        TreeNode* tree;
    public:
        SegmentTree(int);
        virtual ~SegmentTree(){delete[]tree;}
 //构建树
        void build(int, int);
 //插入一个数
 &n......

阅读全文(2886) | 评论:2

线段树的应用PKU3264(2008-08-21 12:31:00)

摘要:#include <iostream>

using namespace std;

typedef struct
{
    int lbound, rbound;
    int left, right;
    int minnum, maxnum;
}TreeNode;

class SegmentTree
{
    public:
        int nodenum;
        TreeNode* tree;
    public:
        SegmentTree ( int );
        void build ( int, int );
        void insert ( int, int );
        void search ( int, int, int);
        virtual ~SegmentTree() {delete[]tree;}
};

//当区间长度小于128时采用顺序查找,以减少递归带来的开销
const int len = 128;
//存储区间权重
int ary[50010];
//最大最小值
int Max;
int Min;

SegmentTree::SegmentTree ( int a )
{
    tree = new TreeNode[2*a+10];
......

阅读全文(2445) | 评论:0

并查集的实现及应用:最小生成树(2008-08-15 10:40:00)

摘要://///////////////////////////////////////
//作品名称:并查集的实现及应用 //作者姓名:梁岳传
//作品时间:2008-8-15
//最后修改:2008-8-15
//Q Q 号码:280282813
//版权所有,翻版必究
/////////////////////////////////////////
#include<iostream> using namespace std; class Set
{
private:
 int* ary;
 int length;
public:
 int Find(int index);
 bool Union(int first, int second);
 Set(int n);
 virtual ~Set(){delete[]ary;} }; Set::Set(int n)
{
 int i;
 ary = new int[n];
 length = n;
 for(i = 0; i < n; ++i)
  ary[i] = -1;
} //将每次查找过的路线上的结点全部都指向根结点
int Set::Find(int index)
{
 int i, j, t;  if(index < 0 || index >= length) return -1;
 
 //查找index元素的根结点
 for(i = index; ary[i] >= 0; i = ary[i]);
 //将这条路线上的所有元素全部指向根结点
 for(j = index; j != i; j = t){
  t = ary[j];
  ary[j] = i;
 }  return i;

阅读全文(2647) | 评论:1