#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);
}
簡單Graph類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.