简单Graph类

来源:互联网 发布:淘宝卖家打印订单 编辑:程序博客网 时间:2024/05/14 03:35
#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 0