邻接矩阵(Adjacency Matrix)
来源:互联网 发布:百度电脑软件管家 编辑:程序博客网 时间:2024/05/21 23:33
/*----------------------------Graph的定义与操作---------------------------------
基本操作:
1、 CreateGraph(&G,V,VR);
初始条件:V是图的顶点集,VR是图中弧的集合;
操作结果:按V和VR的定义构成图?
?
2、 DestoryGraph(&G);
初始条件:图G存在;
操作结果:销毁图G。
3、 LocateVex(G,u);
初始条件:图G存在,u和G中顶点有相同的特征;
操作结果:若图G存在顶点u,则返回该顶点在图中的位置;否则返回其它信息。?
?
4、 GetVex(G,v);
初始条件:图G存在,v是G中的某个顶点;
操作结果: 返回v的值。
5、 PutVex(&G,v,value);
初始条件:图G存在,v是G中的某个顶点;
操作结果: 对v赋值value。
6、 FirstAdjVex(G,v);
初始条件:图G存在,v是G中的某个顶点;
操作结果: 返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回“空”。?
7、 NextAdjVex(G,v,w);
初始条件:图G存在,v是G中的某个顶点,w是v的邻接顶点;
操作结果: 返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接顶点,
则返回“空”。?
8、 InsertVex(&G,v);
初始条件:图G存在,v和G中顶点有相同的特征;
操作结果:在图G中增加新顶点v。
9、 DeleteVex(&G,v);
初始条件:图G存在,v是G中的某个顶点;
操作结果: 删出图G中顶点v及其相关的弧?
10、InsertArc(&G,v,w);
初始条件:图G存在,v和w是G中的两个顶点;
操作结果: 在G中增添弧<v,w>,若G是无向的,则还要增添对称弧<w,v>。
11、DFSTraverse(G,Visit());
初始条件:图G存在,Visit()是G顶点的应用函数;
操作结果: 对图进行深度优先遍历。在遍历过程中对每个顶点调用函数Visit()一次
且仅一次。一旦Visit()失败,则操作失败。
12、BFSTraverse(G,Visit());
初始条件:图G存在,Visit()是G顶点的应用函数;
操作结果: 对图进行广度优先遍历。在遍历过程中对每个顶点调用函数Visit()一次
且仅一次。一旦Visit()失败,则操作失败。
------------------------------------------------------------------------------*/
/*=============================邻接矩阵的存储结构=============================*/
#include<stdio.h>
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define ADJACENCY 1
#define UNADJACENCY 0
#define NETWORK_INFINITY 32767
#define MAX_VERTEX_NUM 20
int visited[MAX_VERTEX_NUM];
typedef int VRType;
typedef int VertexType;
typedef char InfoType;
typedef enum{ DG,DN,UDG,UDN }GraphKind;
typedef struct ArcCell {
VRType adj;
InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
GraphKind kind;
}AMGraph;
/*========================邻接矩阵的基本操作的实现============================*/
/*-----------------------1、 CreateGraph(&G,V,VR)-----------------------------*/
int CreateGraph( AMGraph *G )
{
int choice=0;
printf(" 1-Directed Graph /n");
printf(" 2-Directed Network /n");
printf(" 3-UnDirected Graph /n");
printf(" 4-UnDirected Network /n/n");
do{ if(choice<1||choice>4)printf(" Choose: ");scanf("%d",&choice);}
while(choice<1||choice>4);
G->kind = (GraphKind)(choice);
switch(G->kind){
case DG+1: return CreateDG(G);
case DN+1: return CreateDN(G);
case UDG+1: return CreateUDG(G);
case UDN+1: return CreateUDN(G);
default : return ERROR;
}
}
int CreateDG( AMGraph *G )
{
int IncInfo,i,j,k; VertexType v1,v2;
printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
printf(" The Graph's incinfo:"); scanf("%d", &IncInfo); printf("/n");
/*顶点编号或者名称*/
for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
/*初始化邻接矩阵*/
for(i=0;i< G->vexnum ;i++)
for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = UNADJACENCY; (G->arcs)[i][j].info = NULL ; }
/* 构造邻接矩阵 */
for(k = 0;k < G -> arcnum;k ++){
printf("/n The %d Arc ./n",k+1);
printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
i = LocateVex(*G,v1); j = LocateVex(*G,v2);
(G->arcs)[i][j].adj = ADJACENCY;
if(IncInfo){
printf(" Enter %d arc's IncInfo:",k+1);
scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
}
printf("/n");
}
return OK;
}
int CreateDN(AMGraph *G )
{
int IncInfo,i,j,k; VertexType v1,v2,w;
printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
printf(" The Graph's incinfo:"); scanf("%d", &IncInfo); printf("/n");
/*顶点编号或者名称*/
for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
/*初始化邻接矩阵*/
for(i=0;i< G->vexnum ;i++)
for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = NETWORK_INFINITY; (G->arcs)[i][j].info = NULL ; }
/* 构造邻接矩阵 */
for(k = 0;k < G -> arcnum;k ++){
printf("/n The %d Arc ./n",k+1);
printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
printf(" The arc weight:");scanf("%d",&w);
i = LocateVex(*G,v1); j = LocateVex(*G,v2);
(G->arcs)[i][j].adj = w;
if(IncInfo){
printf(" Enter %d arc's IncInfo:",k+1);
scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
}
printf("/n");
}
return OK;
}
int CreateUDG( AMGraph *G )
{
int IncInfo,i,j,k; VertexType v1,v2;
printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
printf(" The Graph's incinfo:"); scanf("%d", &IncInfo); printf("/n");
/*顶点编号或者名称*/
for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
/*初始化邻接矩阵*/
for(i=0;i< G->vexnum ;i++)
for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = UNADJACENCY; (G->arcs)[i][j].info = NULL ; }
/* 构造邻接矩阵 */
for(k = 0;k < G -> arcnum;k ++){
printf("/n The %d Arc ./n",k+1);
printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
i = LocateVex(*G,v1); j = LocateVex(*G,v2);
(G->arcs)[i][j].adj = ADJACENCY;
if(IncInfo){
printf(" Enter %d arc's IncInfo:",k+1);
scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
}
(G->arcs)[j][i] = (G->arcs)[i][j];
printf("/n");
}
return OK;
}
int CreateUDN( AMGraph *G )
{
int IncInfo,i,j,k;
VertexType v1,v2,w;
printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
printf(" The Graph's incinfo:"); scanf("%d", &IncInfo); printf("/n");
/*顶点编号或者名称*/
for(i = 0;i < G -> vexnum ;i ++){
printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i);
}
/*初始化邻接矩阵*/
for(i=0;i< G->vexnum ;i++)
for(j=0;j< G->vexnum ;j++){
(G->arcs)[i][j].adj = NETWORK_INFINITY; (G->arcs)[i][j].info = NULL ;
}
/* 构造邻接矩阵 */
for(k = 0;k < G -> arcnum;k ++){
printf("/n The %d Arc ./n",k+1);
printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
printf(" The arc weight:");scanf("%d",&w);
i = LocateVex(*G,v1); j = LocateVex(*G,v2);
(G->arcs)[i][j].adj = w;
if(IncInfo){
printf(" Enter %d arc's IncInfo:",k+1);
scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
}
(G->arcs)[j][i] = (G->arcs)[i][j];
printf("/n");
}
return OK;
}
/*----------------------------3、 LocateVex(G,u)------------------------------*/
int LocateVex( AMGraph G,VertexType u )
{
int ivex;
for(ivex = 0;ivex < G.vexnum ;ivex ++)
if(u == G.vexs[ivex])
return ivex;
return ERROR;
}
/*------------------------6、 FirstAdjVex(G,v)----------------------------*/
/*操作结果: 返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回“空”。*/
int FirstAdjVex(AMGraph G,int ivex)
{
int jvex;
for(jvex =0;jvex < G.vexnum;jvex ++)
if(G.arcs[ivex][jvex].adj == ADJACENCY) return jvex;
if(jvex >= G.vexnum) return ERROR;
}
/*-------------------------7、 NextAdjVex(G,v,w)----------------------------*/
/*操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接顶点,则返回“空”。 */
int NextAdjVex(AMGraph G,int ivex ,int jw)
{
for(jw +=1 ;jw < G.vexnum;jw ++)
if(G.arcs[ivex][jw].adj == ADJACENCY) return jw;
if(jw >= G.vexnum) return ERROR;
}
/*--------------------------11、深度优先遍历---------------------------------*/
/* int visited[MAX_VERTEX_NUM] */
void VisitFunc(AMGraph G,int v)
{
printf("%6d",G.vexs[v]);
}
void DFS( AMGraph G,int v )
{
int w;
visited[v] = TRUE; VisitFunc(G,v);
for(w = FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
if(!visited[w]) DFS(G,w);
}
void DFSTraverse( AMGraph G,int v )
{
for(v=0;v<G.vexnum;v++) visited[v] = FALSE;
for(v=0;v<G.vexnum;v++)
if(!visited[v]) DFS(G,v);
}
/*============================================================================*/
/*============================主函数main()====================================*/
int main( void )
{
int i,j,ivex;
AMGraph G;
CreateGraph( &G );
printf("The Adjacency Matrix is:/n");
for(i = 0;i < G.vexnum;i ++){
for(j = 0;j < G.vexnum;j ++)
printf("%6d",G.arcs[i][j].adj);
printf("/n");
}
printf("DFSTraverse AMGraph:/n");
DFSTraverse(G,ivex);
getch();
}
- 邻接矩阵(Adjacency Matrix)
- 邻接矩阵(Adjacency Matrix)
- Adjacency Matrix of Graph(图的邻接矩阵)
- Adjacency Matrix -- c++实现
- 图(有向图,无向图)的邻接矩阵表示C++实现(遍历,拓扑排序,最短路径,最小生成树) Implement of digraph and undigraph using adjacency matrix
- GeeksforGeeks - Adjacency List邻接矩阵C\C++代码
- OSPF(一):Neighbor&Adjacency
- 邻接多重表(Adjacency Multilist)
- The history of Graph Store(matrix, adjacency list, and orthogonal list)
- laplacian,degree,adjacency and oriented incidence matrix, differential and laplacian coordinates
- 图(一)之邻接表Adjacency List
- 图(邻接矩阵)
- 条条大路通罗马(邻接矩阵法)
- (ljjz.h)邻接矩阵
- Dijkstra模板(邻接矩阵)
- 普通dijkstra(邻接矩阵)
- 拓扑排序(邻接矩阵)
- 图、遍历(邻接矩阵)
- 星期六
- hibernate的Dao作为单例时需要注意的问题
- 修改mplayer,使其支持在线无缝播放多个flv片段
- 算命
- Ubuntu 7.10配置SSH服务
- 邻接矩阵(Adjacency Matrix)
- Struts1.x 跨站脚本(XSS)漏洞的解决
- 使用Memory Analyzer tool(MAT)分析内存泄漏(一)
- 邻接多重表(Adjacency Multilist)
- 有穷状态自动机
- 广度优先遍历和深度优先遍历
- Huffman编码
- 十字链表
- 切实反思“形式化方法”-David Lorge Parnas