图:G=(V,E)
V:顶点 要求有穷非空 E:边 要求有穷
完全图;任意两个电都有一条边相连
无向完全图:n*(n-1)/2条边
有向完全图:n*(n-1)条边
网:边带权的图
邻接:有边相连的两个顶点的关系
顶点度:与该顶点关联的边的度数
当前的有向图中只有一个顶点的入度为0,
其余顶点的入度均为1,此时是啥形状?
有向树
连通图:若对图G任何两个顶点都存在从v到u的路径,则称G是连通图
连通分量:
无向图G的极大连通子图称为G的连通分量
顶点表+邻接矩阵
无向图
对角线为0,关于对角线对称
顶点i的度 = 第i行(列)中1的个数
完全图的邻接矩阵,对角线为0,其余为1
有向图
可能不是对称矩阵
行出 列入
度 = 行 + 列
网邻接矩阵
邻接矩阵存储表示:用两个数组分别存储顶点表和邻接矩阵
#define MaxInt 32767 //无穷大
#define MVNum 100; //最大顶点数
typedef char VerTexType; //设顶点的数据类型为字符型
typedef int ArcType; //假设边的权值类型为整形
typedef struct{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //图当前点数和边数
}AMGraph;
以无向网为例
Status CreatUDN(AMGraph &G){
cin>>G.vexnum>>G.arcnum; //输入总顶点数,总边数
for(i = 0; i<G.vexnum; ++i)
cin>>G.vexs[i]; //依次输入点的信息
for(i = 0; i<G.vexnum; ++i) //初始化邻接矩阵
for(i = 0; i<G.vexnum; ++i)
G.arcs[i][j] = MaxInt; //边的权值为极大值
for(k = 0; k<G.arcnum; ++k){
cin>>v1>>v2>>w; //输入一条边所依附的顶点及边的权值
i = LocateVex(G,v1);
j = LocateVex(G,v2); //确定v1和v2在G中的位置
G.arcs[i][j] = w; //边<v1,v2>的权值设为w
G.arcs[j][i] = w; //对称
}//for
return OK;
}//CreatUDN
int LocateVex(AMGraph G, VertexType u){
//图G中查找顶点u,存在则返回顶点表中的下标,否则返回-1
int i;
for(i = o; i<G.vexnum; ++i)
if(u == G.vexs[i]) return i;
return -1;
}
***************************************
无向图:
初始化时,w = 0;
构造邻接矩阵时,w = 1;
有向网:
非对称矩阵
仅为G.arcs[i][j]赋值,不要ji也赋值
有向图:无向图+有向网
邻接表表示法