码迷,mamicode.com
首页 > 其他好文 > 详细

图的大体架构以及主要知识

时间:2015-07-21 14:54:19      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:数据结构      

首先把图分为4点来定义

1.什么是图 

图的定义图就是由两个集合组成的含有定点集合以及边集合

分为有向图无向图

2.图的存储

邻接矩阵:

技术分享技术分享

行:表示尾(通过遍历非0元素个数可以知道入度)

列:标示头(通过遍历非0元素个数可以知道出度)

const int MaxVex=100;                      //图中最大顶点数
  typedef  char  VertexType;   

  typedef  struct  vertex
  {
        int adjvex;                       
        VertexType  data;                 //顶点的位置
   }VType;
   
  typedef  struct  graph
  {
      int n,e;                                            //n为顶点数,e为边数
      VType vexs[MaxVex];                  //顶点集合
       int  edges[MaxVex][MaxVex];    
   }AdjMatrix;

关联矩阵:

表示定点与边的关联关系的矩阵

技术分享

邻接矩阵:

typedef   struct   node
{   int  adjvex;       //邻接点域,存放与Vi邻接的点在表头数组中的位置
    struct  node  *next;   //链域,指示下一条边或弧指向的点
}JD;
表头接点:
typedef   struct  tnode
{   int  vexdata;     //存放顶点信息
     JD  *firstarc;    //指示第一个邻接点
}TD;

TD   ga[M];  //ga[0]不用
技术分享

首先有一个表头之后存放n个结点每一个结点后跟n个结点包括指向指针结点域与后一个指针

边集数组:

typedef   struct   node
{  
     int  fromvex;       //起点
     int  tovex;           //终点
     int weight;          //权
}EdgeElem;

EdgeElem   EdgeSet[EdgeNum];


3.图的遍历

深度优先遍历

技术分享

从图的某一顶点V0出发,访问此顶点;然后依次从V0的未被访问的邻接点出发,

深度优先遍历图,直至图中所有和V0相通的顶点都被访问到;若此时图中尚有顶点未被访问,

则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止。

广度优先遍历

技术分享

跟着边一层一层的访问

4.生成树

生成树:按照遍历的方式生成

技术分享

最小生成数算法

普里姆算法

n个城市建立通讯网花费最低问题

技术分享

第一步找与初始连接的权值最小的边

第二步找与这条边相连的边中最小的边

一直迭代知道所有的点都连接

#define M 30
#define MAX 100
void minispantree_PRIM(int ad[][M],int n)    //n为起始顶点号
{  int i,j,k,p,q,wm;
   q=p=n-1;
   ad[q][q]=1;
   for(k=0;k<(n-1);k++)                            //每次找一条边,共需n-1条边
   {  wm=MAX;
      for(i=0;i<n;i++)                                  //对n个点进行扫描
         if(ad[i][i]==1)
            for(j=0;j<n;j++)                              //查找与已联入的点边权值最小的边
               if( (i!=j) && (ad[i][j]<wm) && (ad[i][j]>0) && (ad[j][j]==0) )
               {   wm=ad[i][j];
                   p=i;
                   q=j;
               }
      ad[q][q]=1;
      printf("%d   %d   %d\n",p+1,q+1,ad[p][q]);
     ad[p][q] =ad[q][p]= -ad[p][q];
  }
}
迪杰斯特拉算法

求最短路径算法

技术分享

依次迭代上一个数的最小值与n条路径比较








版权声明:本文为博主原创文章,未经博主允许不得转载。

图的大体架构以及主要知识

标签:数据结构      

原文地址:http://blog.csdn.net/qq_23301703/article/details/46983929

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!