图相关算法c/c++
2021-02-09 00:15
标签:next node 完整 div ges size 有向图 指针 printf 图相关算法c/c++ 标签:next node 完整 div ges size 有向图 指针 printf 原文地址:https://www.cnblogs.com/cway/p/12768799.html 1 typedef char InfoType;
2 //图的邻接矩阵储存方法
3
4 //图的邻接矩阵表示是唯一的
5 //邻接矩阵适合储存边的数目比较多的稠密图
6 //无向图的邻接矩阵是一个对称矩阵
7 //对于无向图,第i行或者第i列非0,非INF元素的个数正好是顶点i的度
8 //对于有向图,第i行或者第i列非0,非INF元素的个数正好是顶点i的出度或者入度
9 //判断两个结点之间是否有边或者求两个结点之间的权的复杂度为O(1)
10 typedef struct{
11 int no;
12 InfoType info;
13 }VertexType;
14
15 typedef struct{
16 int edges[MAXV][MAXV];
17 int n,e;
18 VertexType vexs[MAXV];
19 }MatGraph;
20
21 //图的邻接表储存方法
22
23 //邻接表的表示不唯一
24 //对于无向图,邻接表有n个头节点和2e个边节点
25 //对于有向图,邻接表有n个头节点和e个边节点
26 //对于边数比较少的稀疏表,邻接表比邻接矩阵更节省储存空间
27 //对于无向图,邻接表中顶点i对应的第i个单链表的边节点的数目就是顶点i的度
28 //对于有向图,邻接表中顶点i对应的第i个单链表的边节点的数目仅仅是顶点i的出度
29 // 顶点i的入度为邻接表中所有adjvex值为i的边节点的数目
30 //邻接表中查找顶点i关联的所有边非常快速,在需要提取某个节点的所有邻接点的算法中通常采用邻接表储存结构
31 //边节点
32 typedef struct Anode{
33 int adjvex; //邻接点的编号
34 struct Anode *nextarc; //指向下一条边的指针
35 int weight; //该边的权重
36 }ArcNode;
37 //头节点
38 typedef struct Vnode{
39 InfoType info;
40 ArcNode *firstarc;
41 }VNode;
42 //完整的邻接表
43 typedef struct{
44 VNode adjlist[MAXV];
45 int n,e;
46 }AdjGraph;
47
48 //用图的邻接矩阵创建图的邻接表
49 void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e)
50 {
51 ArcNode *p;
52 G = (AdjGraph *)malloc(sizeof(AdjGraph));
53 for(int i = 0;i )
54 G->adjlist[i].firstarc = NULL;
55 G->n = n;G->e = e;
56 for(int i = 0;i )
57 for(int j = n-1;j >= 0;j--)
58 {
59 if(A[i][j] != 0 && A[i][j] != INF)
60 {
61 p = (ArcNode *)malloc(sizeof(ArcNode));
62 p->adjvex = j;p->weight = A[i][j];
63 p->nextarc = G->adjlist[i].firstarc;
64 G->adjlist[i].firstarc = p;
65 }
66 }
67 }
68 //输出图(邻接表储存结构)
69 void DispGraph(AdjGraph *G)
70 {
71 ArcNode *p;
72 for(int i = 0;i n;i++)
73 {
74 p = G->adjlist[i].firstarc;
75 printf("%3d:",i);
76 while(p != NULL)
77 {
78 printf("%3d[%3d]->",p->adjvex,p->weight);
79 p = p->nextarc;
80 }
81 printf("#\n");
82 }
83 }
84 //销毁图(邻接表储存结构)
85 void DestroyGrapgh(AdjGraph *G)
86 {
87 ArcNode *pre,*p;
88 for(int i = 0;i n;i++)
89 {
90 pre = G->adjlist[i].firstarc;
91 if(pre != NULL)
92 {
93 p = pre->nextarc;
94 while(p != NULL)
95 {
96 free(pre);
97 pre = p;
98 p = p->nextarc;
99 }
100 free(pre);
101 }
102 }
103 free(G);
104 }
105 //将邻接矩阵转换为邻接表
106 void MatToList(MatGraph g,AdjGraph *&G)
107 {
108 ArcNode *p;
109 G = (AdjGraph *)malloc(sizeof(AdjGraph));
110 G->n = g.n; G->e = g.e;
111 for(int i=0; i )
112 for(int j = g.n-1;j >= 0;j--)
113 {
114 if(g.edges[i][j]!=0 && g.edges[i][j]!=INF)
115 {
116 p = (ArcNode *)malloc(sizeof(ArcNode));
117 p->adjvex = j; p->weight = g.edges[i][j];
118 p->nextarc = G->adjlist[i].firstarc;
119 G->adjlist[i].firstarc = p;
120 }
121 }
122 }
123
124 //将邻接表转换为邻接矩阵
125
126 void ListToMat(AdjGraph *G,MatGraph g)
127 {
128 ArcNode *p;
129 for(int i = 0;i n;i++)
130 {
131 p = G->adjlist[i].firstarc;
132 while(p != NULL)
133 {
134 g.edges[i][p->adjvex] = p->weight;
135 p = p->nextarc;
136 }
137 }
138 g.n = G->n;
139 g.e = G->e;
140 }