EdgeWeightedGraph.h
#pragma once
#include <memory>
#include <stdexcept>
#include <fstream>
#include <iterator>
#include <sstream>
#include "priority_queue.h"
template <typename T>
class LazyPrimMST;
template <typename T>
class PrimMST;
template<typename T>
class Kruskal;
template<typename T>
class EdgeWeightedGraph
{
public:
class AdjacentcyList
{
public:
class Edge
{
public:
std::shared_ptr<Edge> next;
int v1;
int v2;
T weight;
Edge(const int& v1,const int& v2,const T& w):v1(v1),v2(v2),weight(w),next(nullptr)
{
}
Edge(const Edge& e) :v1(e.v1), v2(e.v2), weight(e.weight), next(nullptr)
{
}
Edge() = default;
friend std::ostream& operator << (std::ostream& os, const Edge& e);
friend bool operator < (const Edge& lhs,const Edge& rhs)
{
return lhs.weight < rhs.weight;
}
friend bool operator == (const Edge& lhs,const Edge& rhs)
{
return lhs.weight == rhs.weight;
}
/******************************************
函数名称: Weight
函数说明: 返回相应边的权重
返回值: T
*******************************************/
T Weight()const
{
return weight;
}
/******************************************
函数名称: either
函数说明: 返回边顶点之一
返回值 int
*******************************************/
int either()const
{
return v1;
}
/******************************************
函数名称: other
函数说明: 返回边的另一顶点
返回值: int
*******************************************/
int other(const int& v)
{
if (v == v1)
return v2;
else if (v == v2)
return v1;
else
throw std::out_of_range("other's arguement out_of_range");
}
};
std::shared_ptr<Edge> head;
class Iterator
{
private:
std::shared_ptr<Edge> it;
public:
Iterator(std::shared_ptr<Edge> i):it(i)
{
}
bool operator ==(const Iterator& rhs)const
{
return it == rhs.it;
}
bool operator !=(const Iterator& rhs)const
{
return it != rhs.it;
}
Iterator operator ++()
{
it = it->next;
return *this;
}
Edge operator *()
{
if (it == nullptr)
throw std::logic_error("can't * nullpoint");