正文

图的建立,深度搜索和广度搜索的实现2007-04-10 17:45:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/andyhou/24753.html

分享到:

//                           图的建立和深度搜索和广度搜索的实现#include <iostream>#include <queue>using namespace std;const int UNVISITED=1000;const int VISITED=100; class Graph{public: virtual int n()=0; virtual int e()=0; virtual int first(int)=0; virtual int next(int,int)=0; virtual void setEdge(int, int, int)=0; virtual void delEdge(int, int)=0; virtual int weight(int, int)=0; virtual int getMark(int)=0; virtual void setMark(int,int)=0;};class Edge{public: int vertex,weight; Edge() {  vertex=-1;  weight=-1; } Edge(int v,int w) {  vertex=v;  weight=w; }}; class Graphm:public Graph{private: int numVertex,numEdge; int **matrix; int *mark;public: Graphm(int numVert) {  int i,j;  numVertex=numVert;  numEdge=0;  mark=new int[numVert];  for(i=0;i<numVertex;i++)   mark[i]=UNVISITED;  matrix=(int **)new int*[numVertex];  for(i=0;i<numVertex;i++)   matrix[i]=new int[numVertex];  for(i=0;i<numVertex;i++)   for(j=0;j<numVertex;j++)    matrix[i][j]=0; } ~Graphm() {  for(int i=0;i<numVertex;i++)   delete matrix[i];  delete matrix; } int n(); int e(); int first(int v); int next(int v1,int v2); void setEdge(int v,int w,int wgt); void delEdge(int v,int w); int weight(int v,int w); int getMark(int v); void setMark(int v,int w); void DFS(Graphm* G,int v); void graphTraverse(Graphm *G,int DorB); void BFS(Graphm* G,int v); void PreVisit(Graphm* G,int v); void PosVisit(Graphm* G,int V);}; int Graphm::n(){ return numVertex;} int Graphm::e(){ return numEdge;} int Graphm::first(int v){ int i; for(i=0;i<numVertex;i++)  if(matrix[v][i]!=0)   return i; return i;} int Graphm::next(int v1,int v2){ for(int i=v2+1;i<numVertex;i++)  if(matrix[v1][i]!=0)   return i; return i;} //set Edge(v1,v2) to wgtvoid Graphm::setEdge(int v1,int v2,int wgt){ if(wgt>0)  cout<<"Illegal weight value"<<endl; if(matrix[v1][v2]==0)  numEdge++; matrix[v1][v2]=wgt;} void Graphm::delEdge(int v1,int v2){ if(matrix[v1][v2]==0)  numEdge--; matrix[v1][v2]=0;} int Graphm::weight(int v1,int v2){ return matrix[v1][v2];} int Graphm::getMark(int v){ return mark[v];} void Graphm::setMark(int v,int val){ mark[v]=val;} void Graphm::graphTraverse(Graphm* G,int DorB){ for(int v=0;v<G->n();v++)  G->setMark(v,UNVISITED); for(v=0;v<G->n();v++)  if(G->getMark(v)==UNVISITED)   if(DorB>0)     DFS(G,v);   else     BFS(G,v);} void Graphm::DFS(Graphm* G,int v){  G->setMark(v,VISITED);  for(int w=G->first(v);w<G->n();w=G->next(v,w))  if(G->getMark(w)==UNVISITED)   DFS(G,w); cout<<v<<" ";} void Graphm::BFS(Graphm* G,int v){ using std::queue; queue<int> Q; int val; G->PreVisit(G,v); Q.push(v); G->setMark(v,VISITED); while(Q.empty()!=NULL) {  val=Q.front();  Q.pop();  for(int w=G->first(v);w<G->n();w=G->next(v,w))   if(G->getMark(v)==UNVISITED)   {     G->setMark(w,VISITED);      Q.push(w);   } }} void Graphm::PreVisit(Graphm* G,int v){ cout<<v<<" ";} void Graphm::PosVisit(Graphm* G,int v){  cout<<v<<endl;}     int main(){ Graphm G(10); int val,v1,v2,BorD; cout<<"Enter the 10 matrix graph"<<endl; cout<<"If there is a edge you can enter 1:"<<endl; for(int i=0;i<10;i++) {  cin>>v1;  cin>>v2;  cin>>val;  G.setEdge(v1,v2,val); } cout<<"Enter a interge '1' or '0':"<<endl; cout<<"if you Enter 1 will be print by DFS,else BFS"<<endl; cin>>BorD; G.graphTraverse(&G,BorD); return 0;}           对于图的建立我采用设置边的方法.我也是采用矩阵的方法实现.由于对C++的很多语法的 忘记.有的地方都没有很完善的写好C++.这个程序只能在VC6.0中运行.    

阅读(2610) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册