滴水逆向联盟

标题: VC++2012编程演练数据结构《29》图 [打印本页]

作者: 大灰狼    时间: 2014-8-19 08:54
标题: VC++2012编程演练数据结构《29》图
图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
  在上面两个图结构中,一个是有向图,即每条边都有方向,另一个是无向图,即每条边都没有方向。
  在有向图中,通常将边称作弧,含箭头的一端称为弧头,另一端称为弧尾,记作<vi,vj>,它表示从顶点vi到顶点vj有一条边。
  若有向图中有n个顶点,则最多有n(n-1)条弧,我们又将具有n(n-1)条弧的有向图称作有向完全图。以顶点v为弧尾的弧的数目称作顶点v的出度,以顶点v为弧头的弧的数目称作顶点v的入度。在无向图中,边记作(vi,vj),它蕴涵着存在< vi,vj>和<vj,vi>两条弧。若无向图中有n个顶点,则最多有n(n-1)/2条弧,我们又将具有n(n-1)/2条弧的无向图称作无向完全图。与顶点v相关的边的条数称作顶点v的度。
  路径长度是指路径上边或弧的数目。
  若第一个顶点和最后一个顶点相同,则这条路径是一条回路。
  若路径中顶点没有重复出现,则称这条路径为简单路径。
  在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通。如果图中任意两个顶点之间都连通,则称该图为连通图,否则,将其中的极大连通子图称为连通分量。
  在有向图中,如果对于每一对顶点vi和vj,从vi到vj和从vj到vi都有路径,则称该图为强连通图;否则,将其中的极大连通子图称为强连通分量。
图的基本操作
  (1)创建一个图结构 CreateGraph(G)
  (2)检索给定顶点 LocateVex(G,elem)
  (3)获取图中某个顶点 GetVex(G,v)
  (4)为图中顶点赋值 PutVex(G,v,value)
  (5)返回第一个邻接点 FirstAdjVex(G,v)
  (6)返回下一个邻接点 NextAdjVex(G,v,w)
  (7)插入一个顶点 InsertVex(G,v)
  (8)删除一个顶点 DeleteVex(G,v)
  (9)插入一条边 InsertEdge(G,v,w)
  (10)删除一条边 DeleteEdge(G,v,w)

  (11)遍历图 Traverse(G,v)

d打开IDE


我们来创建一个工程


类的声名如下


[cpp] view plaincopy






类的实现如下


[cpp] view plaincopy






代码调用如下


[cpp] view plaincopy


  • #include "stdafx.h"  
  •   
  • #include "graph.h"  
  • void main()  
  • {cout<<"graphM.cpp运行结果:\n";  
  • //定义图的点数及搜索起始点序号等  
  • int n,k,i;  
  • //k1为0则无向否则为有向,k2为0则无权否则为有权  
  • int k1,k2;  
  • //标记已访问过的点  
  • bool *vis;  
  • //定义邻接表  
  • adjlist AL;  
  • cout<<"输入图的点数n=";cin>>n;  
  • AL=new edgenode*[n];  
  • vis=new bool[n];  
  • if(!vis) {cout<<"申请堆内存失败!\n";exit(1);}  
  • for(i=0;i<n;i++)  
  •      vis=false;  
  • cout<<"输入选择无向(权)与有向(权)图的值k1,k2:";  
  • cin>>k1>>k2;  
  • //定义邻接矩阵  
  • AdjMatrix A(n,k2);  
  • A.CreateMatrix(n,k1,k2);  
  • cout<<"出发点Vk的序号=";cin>>k;  
  • cout<<"\n输出邻接矩阵相应图的每个顶点:\n";  
  • A.Creatgraph(n,k2);  
  • cout<<"当前的顶点数为:"<<A.NumV()<<endl;  
  • cout<<"当前的边数为:"<<A.NumEdges()<<endl;  
  •    
  • cout<<"图的深度优先搜索顺序:\n";  
  • A.dfsMatrix(vis,k,n,k2);  
  • for(i=0;i<n;i++) vis=false;  
  • cout<<"\n图的广度优先搜索顺序:\n";  
  • A.bfsMatrix(vis,k,n,k2);  
  •    
  • cout<<"\n输出邻接表的每个邻接点:\n";  
  • for(i=0;i<n;i++) vis=false;  
  • A.graphChange(AL,n,k2);  
  • delete []vis;  
  •    
  • A.DeleteEdge(0,2);  
  • A.DeleteEdge(2,0);  
  •    
  • cout<<"当前的顶点数为:"<<A.NumV()<<endl;  
  • cout<<"当前的边数为:"<<A.NumEdges()<<endl;  
  • cout<<"图的深度优先搜索顺序:\n";  
  • A.dfsMatrix(n,k2);  
  • cout<<"\n图的广度优先搜索顺序:\n";  
  • A.bfsMatrix(n,k2);  
  • cin.get();cin.get();  
  • }  




效果如下







欢迎光临 滴水逆向联盟 (http://dtdebug.com/) Powered by Discuz! X3.2