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