//// Created by TeneChang on 2020/10/28.//#include "Heap.h"#include <iostream>using namespace std;Heap::Heap(bool _isMaxHeap) { IsMaxHeap = _isMaxHeap;}Heap::Heap(int _Key[], int _VertexN, bool _IsMaxHeap) { IsMaxHeap = IsMaxHeap; VertexN = 0; for(int i = 1; i <= _VertexN; i++){ Insert(_Key[i]); }}void Heap::ShiftUp(int i) { if(i == 1) return; while(i > 1){ if(Compare(Key[i],Key[i/2])){ swap(Key[i],Key[i/2]); } else break; //shift up util it is smaller than its parent or reaches the top i = i/2; } return;}void Heap::ShiftDown(int i, int n) { //node i is a leaf node if(2*i > n) return; while(2*i <= n){ //swap with the larger children i = 2*i; if(i+1 <= n && Compare(Key[i+1],Key[i])){ i = i+1; } if(Compare(Key[i],Key[i/2])){ swap(Key[i],Key[i/2]); } else break; } return;}void Heap::Insert(int key) { VertexN++; Key[VertexN] = key; ShiftUp(VertexN);}void Heap::Delete(int i) { int x = Key[i]; Key[i] = Key[VertexN]; VertexN--; if(Compare(Key[i],x)) ShiftUp(i); else if(Compare(Key[i], x)) ShiftDown(i,VertexN);}void Heap::DeleteTop() { Delete(1);}int Heap::GetTop() { return Key[1];}void Heap::PrintHeap() { for(int i = 1; i <= VertexN; i++) cout<<Key[i]<<" "; cout<<endl;}void Heap::SetValue(int A[], int n) { VertexN = n; for(int i = 1; i <= n; i++) Key[i] = A[i];}void Heap::HeapSort() { int n = VertexN; for(int i = VertexN; i >= 2; i--){ swap(Key[1], Key[i]); ShiftDown(1,--n); PrintHeap(); }}void Heap::GetValue(int *A) { for(int i = 1; i <= VertexN; i++) A[i] = Key[i];}bool Heap::Compare(int a, int b) { if(IsMaxHeap){ if(a > b) return true; else return false; }else{ if(a < b) return true; else return true; }}
#ifndef GREEDYMANNER_DISJOINTSET_H#define GREEDYMANNER_DISJOINTSET_Hconst int MAXSIZE = 20;class DisjointSet { //use array to represent a forest int Forest[MAXSIZE]; int Rank[MAXSIZE]; int VertexN;public: DisjointSet(); DisjointSet(int n); void MakeSet(int A[], int R[], int n); int Find(int x); void Union(int x, int y); void PrintDisjointSet();};#endif //GREEDYMANNER_DISJOINTSET_H#include "DisjointSet.h"#include <iostream>using namespace std;DisjointSet::DisjointSet(int n) { VertexN = n; for(int i = 1; i <= n; i++){ Forest[i] = i; //point to the root Rank[i] = 0; //initially, the rank is 0 }}DisjointSet::DisjointSet() {}void DisjointSet::MakeSet(int A[], int R[], int n) { VertexN = n; for(int i = 1; i <= n; i++){ Forest[i] = A[i]; //point to the root Rank[i] = R[i]; }}int DisjointSet::Find(int x) { int parent = Forest[x]; while(parent != Forest[parent]){ parent = Forest[parent]; } int root = parent; parent = x; while (parent != Forest[parent]){ int w = Forest[parent]; //record parent Forest[parent] = root; //point to the root parent = w; //shift up } return root;}void DisjointSet::Union(int x, int y) { int root1 = Find(x); int root2 = Find(y); if(Rank[root1] <= Rank[root2]){ Forest[root1] = root2; if(Rank[root1] == Rank[root2]) Rank[root2]++; } else Forest[root2] = root1;}void DisjointSet::PrintDisjointSet() { for(int i = 1; i <= VertexN; i++){ cout<<"("<<i<<","<<Forest[i]<<","<<Rank[i]<<")"<<" "; } cout<<endl;}