存储在vector中img出错_数据结构与算法||第二十一节 图的存储

a4082acdd44739d5dc4843d69a1c0cf2.png

邻接表:每个顶点对应一个链表,借助STL的Vector实现存储功能。

fe29185971e1ee9c160758daf107861e.png

存储程序实现:

#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个,要表达各个顶点之间的关联关系,最清晰易懂的方式就是使用二维数组(矩阵);

a3d0b4d726c1a1adde977ca06bdc1205.png   01a3f59fdc2ef49f5069f07572bcdc18.png

无向图存储特点:

1、无向图的邻接矩阵是对称的;

2、顶点i的度==第i行或者第i列中1的个数;

3、完全图(各个顶点之间都有边)的邻接矩阵中,对角数据为0,其余为1;

有向图邻接矩阵:

拥有n个顶点的有向图,包含的连接数量最多是n(n-1)个;

d21a2a3411b3870f7a3826972c377c41.png   22de1e5cfcfadb25f12fdb4bcfd62574.png

有向图存储特点:

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<    }}

有权图邻接矩阵:

704cc711e83ebf3e6feb5ea862cb299e.png   6b20cb794e00f43fe1eed4ab80546f36.png

有权图存储特点:如果没有边,或者自环,则需要定义为:

程序代码实现:

提示: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、对稀疏图更加浪费空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值