kopia lustrzana https://github.com/jameshball/osci-render
				
				
				
			
		
			
				
	
	
		
			90 wiersze
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			90 wiersze
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
#pragma once
 | 
						|
 | 
						|
#include "Graph.h"
 | 
						|
#include "BinaryHeap.h"
 | 
						|
#include <list>
 | 
						|
#include <vector>
 | 
						|
using namespace std;
 | 
						|
 | 
						|
#define EVEN 2
 | 
						|
#define ODD 1
 | 
						|
#define UNLABELED 0
 | 
						|
 | 
						|
class Matching
 | 
						|
{
 | 
						|
public:
 | 
						|
	//Parametric constructor receives a graph instance
 | 
						|
	Matching(Graph & G);
 | 
						|
 | 
						|
	//Solves the minimum cost perfect matching problem
 | 
						|
	//Receives the a vector whose position i has the cost of the edge with index i
 | 
						|
	//If the graph doest not have a perfect matching, a const char * exception will be raised
 | 
						|
	//Returns a pair
 | 
						|
	//the first element of the pair is a list of the indices of the edges in the matching
 | 
						|
	//the second is the cost of the matching
 | 
						|
	pair< list<int>, double > SolveMinimumCostPerfectMatching(vector<double> & cost);
 | 
						|
 | 
						|
	//Solves the maximum cardinality matching problem
 | 
						|
	//Returns a list with the indices of the edges in the matching
 | 
						|
	list<int> SolveMaximumMatching();
 | 
						|
 | 
						|
private:
 | 
						|
	//Grows an alternating forest
 | 
						|
	void Grow();
 | 
						|
	//Expands a blossom u
 | 
						|
	//If expandBlocked is true, the blossom will be expanded even if it is blocked
 | 
						|
	void Expand(int u, bool expandBlocked);
 | 
						|
	//Augments the matching using the path from u to v in the alternating forest
 | 
						|
	void Augment(int u, int v);
 | 
						|
	//Resets the alternating forest
 | 
						|
	void Reset();
 | 
						|
	//Creates a blossom where the tip is the first common vertex in the paths from u and v in the hungarian forest
 | 
						|
	int Blossom(int u, int v);
 | 
						|
	void UpdateDualCosts();
 | 
						|
	//Resets all data structures 
 | 
						|
	void Clear();
 | 
						|
	void DestroyBlossom(int t);
 | 
						|
	//Uses an heuristic algorithm to find the maximum matching of the graph
 | 
						|
	void Heuristic();
 | 
						|
	//Modifies the costs of the graph so the all edges have positive costs
 | 
						|
	void PositiveCosts();
 | 
						|
	list<int> RetrieveMatching();
 | 
						|
 | 
						|
	int GetFreeBlossomIndex();
 | 
						|
	void AddFreeBlossomIndex(int i);
 | 
						|
	void ClearBlossomIndices();
 | 
						|
 | 
						|
	//An edge might be blocked due to the dual costs
 | 
						|
	bool IsEdgeBlocked(int u, int v);
 | 
						|
	bool IsEdgeBlocked(int e);
 | 
						|
	//Returns true if u and v are adjacent in G and not blocked
 | 
						|
	bool IsAdjacent(int u, int v);
 | 
						|
 | 
						|
	Graph & G;
 | 
						|
 | 
						|
	list<int> free;//List of free blossom indices
 | 
						|
 | 
						|
	vector<int> outer;//outer[v] gives the index of the outermost blossom that contains v, outer[v] = v if v is not contained in any blossom
 | 
						|
	vector< vector<int> > deep;//deep[v] is a list of all the original vertices contained inside v, deep[v] = v if v is an original vertex
 | 
						|
	vector< list<int> > shallow;//shallow[v] is a list of the vertices immediately contained inside v, shallow[v] is empty is the default
 | 
						|
	vector<int> tip;//tip[v] is the tip of blossom v
 | 
						|
	vector<bool> active;//true if a blossom is being used
 | 
						|
 | 
						|
	vector<int> type;//Even, odd, neither (2, 1, 0)
 | 
						|
	vector<int> forest;//forest[v] gives the father of v in the alternating forest
 | 
						|
	vector<int> root;//root[v] gives the root of v in the alternating forest 
 | 
						|
 | 
						|
	vector<bool> blocked;//A blossom can be blocked due to dual costs, this means that it behaves as if it were an original vertex and cannot be expanded
 | 
						|
	vector<double> dual;//dual multipliers associated to the blossoms, if dual[v] > 0, the blossom is blocked and full
 | 
						|
	vector<double> slack;//slack associated to each edge, if slack[e] > 0, the edge cannot be used
 | 
						|
	vector<int> mate;//mate[v] gives the mate of v
 | 
						|
 | 
						|
	int m, n;
 | 
						|
 | 
						|
	bool perfect;
 | 
						|
 | 
						|
	list<int> forestList;
 | 
						|
	vector<int> visited;
 | 
						|
};
 | 
						|
 |