邻接矩阵-建立图

1.介绍图的相关概念

  图是由顶点的有穷非空集和一个描述顶点之间关系-边(或者弧)的集合组成。通常,图中的数据元素被称为顶点,顶点间的关系用边表示,图通常用字母G表示,图的顶点通常用字母V表示,所以图可以定义为:

  G=(V,E)

其中,V(G)是图中顶点的有穷非空集合,E(G)是V(G)中顶点的边的有穷集合

1.1 无向图:图中任意两个顶点构成的边是没有方向的

1.2 有向图:图中任意两个顶点构成的边是有方向的,通常有向图的边也称之为弧

1.3 完全图:图中任意一个顶点与其他节点之间都有边

1.4 稠密图、稀疏图:一个图接近完全图称为稠密图,边数很少的图称为稀疏图

1.6 顶点的度:依附于某顶点的边数称为该顶点的度,在有向图中,以顶点为终点的弧的数目为该顶点的入度,以该点为始点的弧数为该顶点的出度

1.7 权:图中与边或弧有关的数据信息

1.8 网:边上带权的图称为网或带权图

1.9 路径、路径长度:无向图中,从任意一点到另一点所经过的顶点序列称为路径,路径上的边数称为路径长度

2.0 简单路径、简单回路、回路:一条路径中,若路径序列中所有顶点除起始点和中止点之外,彼此都不同,则该路径为简单路径。简单路径中的起始点与中止点相同,该路径为简单回路。如果路径序列中起始点与中止点相同,则该路径为回路或者环。

2.1 连通、连通图:无向图中,某两顶点之间有路径,则称这两个顶点是连通的。如果图中任意两顶点都是连通的,则该无向图为连通图,否则为非连通图。

2.2 极大连通子图、连通分量:如果在向无向连通图中加入原图的任何一个顶点,子图就不连通,则为极大连通分量。无向连通图中的极大连通子图称为该无向图的连通分量。/在有向图中若任意两顶点存在两条弧(一个入度一个出度),则称为强连通图,强连通分量同理。

图G的三个连通分量:

 

2.图的存储

邻接矩阵是表示顶点间相邻关系的矩阵,无向图中,如果两顶点有边,则G[i][j] = G[j][i] = 1,反之为0,有向图中G[i][j] = 1,但是G[j][i] 未必等于1

也可以表示带权图,即将1换位权值即可

程序:

 1 //建立图的邻接矩阵算法程序 /有向图,无权值,两顶点之间有边就用1表示,无边用0表示 
 2 #include<stdio.h>
 3 #include<string.h>
 4 #define MAX_VEX 100 
 5 
 6 int creatcost(int cost[][MAX_VEX])             //*cost数组表示所有带权图的邻接矩阵 
 7 {
 8     int vexnum,arcnum,i,j,k,v1,v2;             //输入图的顶点数和边数(或弧数)
 9 
10     printf("\n请输入顶点数,边数:\n");
11     scanf("%d %d",&vexnum,&arcnum);
12     for(i = 1;i <= vexnum;i++)                 //初始化带权图的邻接矩阵
13         for(j = 1;j <= vexnum;j++)
14             cost[i][j] = 0;                    //0表示无穷大
15     //memset(cost,0,vexnum*vexnum);            //也可以使用memset()函数进行初始化,将整个矩阵置0,需要有文件string.h 
16     for(k = 0;k < arcnum;k++)
17     {
18         printf("v1,v2= ");
19         scanf("%d %d",&v1,&v2);
20         cost[v1][v2] = 1;
21         //cost[v2][v1] = 1;                    //若建立无向图的邻接矩阵就应该加上这句话 
22     } 
23     
24     return vexnum; 
25 }
26 
27 int main()
28 {
29     int i,j,vexnum;
30     int cost[MAX_VEX][MAX_VEX];
31     vexnum = creatcost(cost);
32     printf("所建图的邻接矩阵为:\n");
33     for(i = 1;i <= vexnum;i++)
34     {
35         for(j = 1;j <= vexnum;j++)
36             printf("%3d",cost[i][j]);
37         printf("\n");
38     }
39     
40     return 0;
41 }

邻接矩阵存储其实有一些问题,对于边数相对顶点较少的图,这种存储结构对存储空间存在极大的浪费

 

转载于:https://www.cnblogs.com/mlblog27/p/9535240.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值