简单Graph类

#include<iostream>
#include<string>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
class Node
{
public: 
	bool vis;
	int first;
	Node()
	{
		vis=false;
		first=-1;
	}
};

template<typename Elem>
class Edge
{
public:
	int from,to;
	Elem val;
	int nxt;
	Edge(int f,int t,Elem v)
		:from(f),to(t),val(v)
	{}
	Edge(){}
	explicit Edge(Edge &b)
	{
		b.from=from;
		b.to=to;
		b.val=val;
		b.nxt=nxt;
	}
};

template <typename Elem>
class Graph
{
	int num_of_edge,num_of_node;//容量,真实值大于等于这个值时执行expand函数
	int curNodeSize,curEdgeSize;
	Node *node;
	Edge<Elem> *edge;
	
private:
	void expandNode()
	{
		num_of_node<<=1;
		Node *tem=node;
		node=new Node[num_of_node];
		for(int i=0;i<curNodeSize;i++)
		{
			node[i]=tem[i];
		}
		delete tem;
	}
	void expandEdge()
	{
		num_of_edge<<=1;
		Edge<Elem> *tem=edge;
		edge=new Edge<Elem>[num_of_edge];
		for(int i=0;i<curEdgeSize;i++)
		{
			edge[i]=tem[i];
		}
		delete tem;
	}
public:
	Graph(int nodeNum,int edgeNum)
	{
		node=new Node[nodeNum];
		edge=new Edge<Elem>[edgeNum];
		num_of_edge=edgeNum;
		num_of_node=nodeNum;
		curNodeSize=0,curEdgeSize=0;
	}
	Graph()
	{
		num_of_edge=1000;
		num_of_node=500;
		node=new Node[500];
		edge=new Edge<Elem>[1000];
		curNodeSize=0,curEdgeSize=0;
	}
	void reset()
	{
		for(int i=0;i<curNodeSize;i++)
		{
			node[i].first=-1;
		}
		curNodeSize=0,curEdgeSize=0;
	}
	void addEdge(int from,int to,Elem val)
	{
		edge[curEdgeSize].nxt=node[from].first;
		edge[curEdgeSize].val=val;
		edge[curEdgeSize].to=to;
		edge[curEdgeSize].from=from;
		node[from].first=curEdgeSize++;
		if(curEdgeSize==num_of_edge) expandEdge();
	}
	void addNode()
	{
		curNodeSize++;
		if(curNodeSize==num_of_node) expandNode();
	}
	void DFS(int root)
	{
		cout<<root<<' ';
		node[root].vis=true;
		for(int i=node[root].first;i!=-1;i=edge[i].nxt)
		{
			int to=edge[i].to;
			if(node[to].vis==false)
			{
				DFS(to);
			}
		}
	}


};
int main()
{
	Graph<int> graph(10,50);
	for(int i=0;i<5;i++) graph.addNode();
	graph.addEdge(0,2,3);
	graph.addEdge(1,3,6);
	graph.addEdge(0,1,6);
	graph.DFS(0);

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值