图的邻接矩阵表示方式——无权图的最短路径

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3
  4 #define OK 1
  5 #define NO 0
  6 #define TRUE 1
  7 #define FALSE 0
  8 #define ERROR -1
  9
 10 #define MaxVerTexNum 100
 11 #define INFINITY 65535
 12 typedef int ElementType;
 13 typedef int Status;
 14 typedef int WeightType;
 15 typedef int Vertex;
 16 typedef char DataType;
 17
 18 typedef int Position;
 19 typedef struct QNode{
 20     ElementType *Data;
 21     Position Front, Rear;
 22     int MaxSize;
 23 }QNode,*Queue;
 24
 25 typedef  struct  ENode{
 26     Vertex V1,V2;     //有向边<v1,V2>
 27     WeightType Weight;//权重
 28 }ENode,*PtrToENode ;
 29
 30 typedef PtrToENode Edge;
 31
 32 Status IsFull( Queue Q );
 33
 34 typedef struct GNode{
 35     int Nv;//顶点数
 36     int Ne;//边数
 37     WeightType G[MaxVerTexNum][MaxVerTexNum];//邻接矩阵
 38     DataType Data[MaxVerTexNum];//save data of the Vertex;
 39 }GNode,*PtrToGNode;
 40
 41 typedef PtrToGNode MGraph;
 42
 43 ElementType DeleteQ( Queue Q );
 44
 45 Queue CreateQueue( int MaxSize );
 46
 47 Status IsEmpty( Queue Q );
 48
 49 Status AddQ( Queue Q, ElementType X );
 50
 51 MGraph CreateGraph(int VertexNum);//Create a Graph with VertexNum Vertex but without an ege;
 52
 53 void InsertEdge(MGraph Graph,Edge E);
 54
 55 MGraph BuildGraph();
 56
 57 Status IsEdge(MGraph Graph,Vertex V,Vertex W);//检查<V,W>是不是图中的一条边,即W是不是V的邻接点
 58
 59 void BFS(MGraph Graph,Vertex S);
 60
 61 void Unweighted(MGraph Graph,int dist[],int path[],Vertex);
 62
 63 int main(int argc,char** argv)
 64 {
 65     MGraph Graph;
 66     Graph=BuildGraph();
 67
 68     int i,j;
 69     int dist[100];
 70     int path[100];
 71
 72     Vertex S=1;
 73     int sum;
 74     for(i=0;i<=99;i++)
 75     {
 76         dist[i]=path[i]=-1;
 77     }
 78
 79     printf("无向图最短路径\n");
 80     Unweighted(Graph,dist,path,S);
 81
 82     for(j=0;j<Graph->Nv;j++){     //出现死循环要多调试
 83         i=j;
 84         sum=0;
 85     while(i!=-1){
 86
 87         printf("%d",i);
 88         i=path[i];
 89         if(i!=-1){
 90             printf("<--");
 91             sum++;
 92         }
 93
 94     }
 95     printf("\n");
 96     printf("从%d到%d的无权图最短路径为%d\n",S,j,sum);
 97     printf("\n");
 98     }
 99
100     //DFS(Graph, 1);
101     return 0;
102 }
103
104 MGraph CreateGraph(int VertexNum){
105     Vertex V,W;
106     MGraph Graph;
107     Graph=(MGraph)malloc(sizeof(GNode));//form a Graph
108     Graph->Nv=VertexNum;
109     Graph->Ne=0;//
110     for(V=0;V<Graph->Nv;V++)
111         for(W=0;W<Graph->Nv;W++)
112             Graph->G[V][W]=INFINITY;
113         return Graph;
114 }
115
116 void InsertEdge(MGraph Graph,Edge E){
117     Graph->G[E->V1][E->V2]=E->Weight;
118     //若是无向图还要插入
119     Graph->G[E->V2][E->V1]=E->Weight;
120 }
121
122 MGraph BuildGraph(){
123     MGraph Graph;
124     Edge E;
125     Vertex V;
126     int Nv,i;
127     printf("输入结点的个数\n");
128     scanf("%d",&Nv);//the number of vertex
129     Graph=CreateGraph(Nv);//initate graph with Nv vertexs  !!return 回去要赋值给Graph;
130     //getchar();
131     printf("输入弧的个数\n");
132     scanf("%d",&(Graph->Ne));//read the number of ege
133     if(Graph->Ne!=0)
134     {
135         E=(Edge)malloc(sizeof(ENode));
136         for(i=0;i<Graph->Ne;i++){
137             // getchar();
138             printf("输入弧的信息V1 V2 Weight\n");
139             scanf("%d %d %d",&(E->V1),&(E->V2),&(E->Weight));
140             InsertEdge(Graph,E);
141         }
142     }
143     // for(V=0;V<Graph->Nv;V++)
144     //     scanf("%c",&(Graph->Data[V]));
145     return Graph;
146
147 }
148
149 void Visit(Vertex V){
150     printf("正在访问顶点%d\n",V);
151 }
152
153 Status IsEdge(MGraph Graph,Vertex V,Vertex W){
154     return Graph->G[V][W]<INFINITY?TRUE:FALSE;
155 }
156
157 Queue CreateQueue( int MaxSize )
158 {
159     Queue Q = (Queue)malloc(sizeof(struct QNode));
160     Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
161     Q->Front = Q->Rear = 0;
162     Q->MaxSize = MaxSize;
163     return Q;
164 }
165
166 Status AddQ( Queue Q, ElementType X )
167 {
168     if ( IsFull(Q) ) {
169         printf("队列满");
170         return FALSE;
171     }
172     else {
173         Q->Rear = (Q->Rear+1)%Q->MaxSize;
174         Q->Data[Q->Rear] = X;
175         return FALSE;
176     }
177 }
178 ElementType DeleteQ( Queue Q )
179 {
180     if ( IsEmpty(Q) ) {
181         printf("队列空");
182         return ERROR;
183     }
184     else  {
185         Q->Front =(Q->Front+1)%Q->MaxSize;
186         return  Q->Data[Q->Front];
187     }
188 }
189
190 Status IsEmpty( Queue Q )
191 {
192     return (Q->Front == Q->Rear);
193 }
194 Status IsFull( Queue Q )
195 {
196     return ((Q->Rear+1)%Q->MaxSize == Q->Front);
197 }
198
199 void Unweighted(MGraph Graph,int dist[],int path[],Vertex S){
200     Queue Q;
201     Vertex V,W;
202     int MaxSize=100;
203     Q=CreateQueue(MaxSize);
204     dist[S]=0;
205     AddQ(Q,S);
206     while(!IsEmpty(Q))
207     {
208         V=DeleteQ(Q);
209         for(W=0;W<Graph->Nv;W++)
210             if(Graph->G[V][W]!=0&&Graph->G[V][W]!=INFINITY){
211                 if(dist[W]==-1){
212                     dist[W]=dist[V]+1;
213                     path[W]=V;
214                 AddQ(Q,W);
215             }
216             }
217     }
218 }

输入输出示例:

时间: 2024-10-16 20:43:21

图的邻接矩阵表示方式——无权图的最短路径的相关文章

看数据结构写代码(35) 图的邻接矩阵表示法

杂谈:最近清明小长假,好好的放松了一下.节前 和 节后 都有点 松懈.不好,不好.贵在坚持.加油. 图的邻接矩阵表示法是用 两个数组 来表示 图的数据结构.一个是顶点数组,另一个是邻接矩阵数组.邻接矩阵 里存放着 顶点的关系. 用邻接矩阵表示图,在 看 顶点之间 是否有边,或者 求顶点的度等操作时比较简单.但空间浪费巨大,在插入,删除 顶点 和边 操作时 需要 移动大量数据,造成不便.所以在插入删除比较多,节点数比较多的时候 不宜 使用这种结构. 下面上代码: 源代码网盘地址:点击打开链接 //

数据结构(C实现)------- 图的邻接矩阵表示

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 图的邻接表表示法类似于树的孩子链表表示法,就是对图中的每个顶点vi,将所有邻接于vi的顶点链接成一个单链表,这个单链表就称为顶点vi的邻接表.在邻接表中有两种结点结构:头结点(vexdata,firstarc).表结点(adjvex,nextarc). 其中,表头结点由顶点域(vexdata)和指向第一条邻接边的指针域(firstarc)构成:表结点由邻接点域(adjvex

图的邻接矩阵表示方法以及遍历

下面的程序可以用来创建有向图,有向网,无向图,无向网.对于图来说如果来个顶点之间存在边,则在矩阵中用1表示,无边则用0表示.在网络中,边是对应权值的. 图的遍历可以分为深度优先遍历和广度优先遍历. 深度优先遍历的思想是,选择某个未被访问的顶点并访问,然后从该顶点出发,选择第一个和该顶点邻接的未被访问的顶点进行访问.在该过程中可以设置一个标识数组flags[]来标识各个顶点是否被访问到. 广度优先搜索的思想是,选择某个未被访问的顶点并访问,然后依次访问该顶点所以的邻接顶点,对于每次被访问的顶点都对

数据结构中图的邻接矩阵表示方法

#include<iostream> using namespace std; typedef char vertextype; typedef int edgetype; #define maxvex 100 #define infinity 1000 class MGraph{ public: vertextype vexs[maxvex]; edgetype arc[maxvex][maxvex]; int numvertexs,numedges;//图的顶点数目和图的边的数目 MGra

图邻接矩阵表示

1.图的邻接矩阵表示法 在图的邻接矩阵表示法中: ① 用邻接矩阵表示顶点间的相邻关系 ② 用一个顺序表来存储顶点信息 2.图的邻接矩阵(Adacency Matrix) 设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的n阶方阵: [例]下图中无向图G 5 和有向图G 6 的邻接矩阵分别为A l 和A 2 . 3.网络的邻接矩阵 若G是网络,则邻接矩阵可定义为: 其中: w ij 表示边上的权值: ∞表示一个计算机允许的.大于所有边上权值的数. [例]下面带权图的两种邻接矩阵分别

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称

图的邻接表表示与无环图的拓扑排序

一.  图的最常用的表示方法是邻接矩阵和邻接表. 1,邻接矩阵 邻接矩阵其实就是一个二维数组,对于每条边<u,v>,我们就令A[u][v] = 1,如果图为有权图,我们也可以令A[u][v]等于该权,这么表示的优点是非常简单,但是它的空间需求很大,如果图是稠密的,邻接矩阵是合适的表示方法,如果图是稀疏的,那这种方法就太浪费空间了,下面给出图的邻接矩阵表示例子. 2 邻接表 邻接表是图的常用储存结构之一.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如下图

利用无权图的单源最短路算法实现地铁换乘图

//Metro.php $MetroVertex = array( 1 => '体育中心', 2 => '体育西路', 3 => '杨箕', 4 => '东山口', 5 => '烈士陵园', 6 => '农讲所', 7 => '公园前', 8 => '西门口', 9 => '陈家祠', 10 => '长寿路', 11 => '黄沙', 12 => '芳村', 13 => '花地湾', 14 => '坑口', 15 =>

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若