首先把图分为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