邻接表:每个顶点对应一个链表,借助STL的Vector实现存储功能。
存储程序实现:
#include#include#define MAX 10000using namespace std;struct Node{ int v; //权值 int to; //去向终点};/* 注意:定义这两个变量一定要定义在使用它们的函数的前面*/vector vt[MAX];//每一个下标对应一个顶点,每一个下标又对应一个vector,链式存放所有关联点Node at;//创建一个去向点//从顶点a到顶点b有一条权值为c的边void add(int a,int b,int c){ at.to=b; at.v=c; //借助Vector完成a--->b存储 vt[a].push_back(at);//这里如果有疑问可以了解一下深拷贝与浅拷贝,这里的at不能使用new的方式来创建,因为容易发生地址相同}//遍历某一个顶点(vector)下,链式关联的所有点void s(int a){ //第一种方法:使用迭代器遍历 for(vector::iterator it=vt[a].begin();it!=vt[a].end();it++){ Node p=*it; cout<" "; } //第二种方法:下标访问 for(int i=0;i cout<" "; }}int main(){ add(2,3,1); add(2,5,1); add(2,4,1); s(2);}
无向图邻接矩阵:
拥有n个顶点的无向图,包含的连接数量最多是n(n-1)/2个,要表达各个顶点之间的关联关系,最清晰易懂的方式就是使用二维数组(矩阵);
无向图存储特点:
1、无向图的邻接矩阵是对称的;
2、顶点i的度==第i行或者第i列中1的个数;
3、完全图(各个顶点之间都有边)的邻接矩阵中,对角数据为0,其余为1;
有向图邻接矩阵:
拥有n个顶点的有向图,包含的连接数量最多是n(n-1)个;
有向图存储特点:
1、行是顶点的出度,列是顶点的入度;
2、有向图的邻接矩阵可能是不对称的;
3、顶点的出度==第i行数据之和,顶点的入度==第i列数据之和,顶点的度==第i行数据之和+第i列数据之和;
邻接矩阵存图:
给出一个包含有向图和无向图的混合图G,图上有n个点和m条边,现在需要使用邻接矩阵来存储该混合图G,并且按格式输出邻接矩阵。输入格式: 输入第一行为两个正整数n和m(1= 接下来输入m行,每行输入三个整数a,x,y,(0= 之间有一条边,如果a==0,则表示该边为有向边,如果a==1,表示该边为无向边。输出格式: 输出一个n*n的邻接矩阵,矩阵中第i行第j列的值描述了点i到点j的连边情况。 如果值为0表示点i到点j没有边相连,值为1表示有边相连。输入样例:4 40 0 11 0 20 3 11 2 3输出样例:0 1 1 00 0 0 01 0 0 10 1 1 0
程序代码实现:
提示:G[i][j]=1; //有向无权 G[i][j]=G[j][i]=1; //无向无权
#include#includeusing namespace std;int G[101][101];//定义二维数组int n,m,a,x,y;int main(){ memset(G,0,sizeof(G));//memset批量初始化,把地址从G开始到地址偏移sizeof(G)为止,所有初始化为0 cin>>n>>m; //构建顶点x与顶点y之间的关系(边) for(int i=0;i cin>>a>>x>>y;//a==0有向边;a==1无向边 if(a==0){ G[x][y]=1;//有向是单向置1 }else{ G[x][y]=1;//无向是双向置1 G[y][x]=1; } } //n个点最终形成n*n的矩阵,所以双重循环遍历 for(int i=0;i for(int j=0;j cout<" "; } cout< }}
有权图邻接矩阵:
有权图存储特点:如果没有边,或者自环,则需要定义为:∞
程序代码实现:
提示:G[i][j]=C; //有向有权 G[i][j]=G[j][i]=C; //无向有权
#include#includeusing namespace std;int G[101][101];//定义二维数组int n,m,a,x,y,C;int main(){ memset(G,0x3f,sizeof(G));//0x7f最大值,0x3f较大值 cin>>n>>m; //构建顶点x与顶点y之间的关系(边) for(int i=0;i cin>>a>>x>>y>>C;//a==0有向边;a==1无向边 if(a==0){ G[x][y]=C;//有向是单向置C }else{ G[x][y]=C;//无向是双向置C G[y][x]=C; } } //n个点最终形成n*n的矩阵,所以双重循环遍历 for(int i=0;i for(int j=0;j cout<" "; } cout< }}
邻接矩阵优点:
1、求顶点的度
2、判断顶点之间是否有边
3、查找顶点的邻接点
邻接矩阵缺点:
1、n个顶点需要n*n个单元存储边
2、空间效率为o(n^2)
3、对稀疏图更加浪费空间