当前位置:首页 » 服务存储 » 假设图采用邻接矩阵存储
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

假设图采用邻接矩阵存储

发布时间: 2022-01-27 03:17:25

‘壹’ 一个包含N个顶点、E条边的简单有向图采用邻接矩阵存储结构

全国2001年10月数据结构试题及答案 12.假设一个有n个顶点和e条弧的有向图用邻接表表示,则删除与某个顶点vi相关的所有弧的时间复杂度是( ) A.O(n)

‘贰’ 有关有向图用邻接矩阵存储的时间复杂度

删除结点O(n)
删除顶点相邻接所有有向边的是O(n)
判断为O(1)
出度O(n)

‘叁’ 图的存储结构可以采用邻接矩阵和邻接表,对于个有n 个顶点,e条边的有向图, (1)计算存储结构分别

邻接表所需的存储空间为e(边数),但不适合查询两点间是否存在路径
邻接矩阵所需的存储空间为你n^2,适合查询两点间是否存在路径
对于第二问,邻接表所需的存储空间为9900,邻接矩阵所需的存储空间为你n^2=10000,差不多,所以选性能更优的邻接矩阵
实际上像(2)这种稠密图(其实是个满图)一般适合邻接矩阵

‘肆’ 要求采用邻接矩阵作为无向图的存储结构,邻接表作为有向图的存储结构,完成无向图和有向图的建立,并对建

#include"utility.h"
#include"adj_matrix_undir_graph.h"
#include"adj_list_dir_graph.h"
#include"dfs.h"
#include"bfs.h"

int main(void)
{
int n,j=0,i=0;
int m,e,b=0;
char vexs[20],c;
char nums[20];

cout<<"输入无向图的顶点个数n:"<<endl;
cin>>n;
cout<<"输入顶点元素:"<<endl;
for(i=0;i<n;i++)
{
cout<<"请输入第"<<j<<"个结点"<<endl;
cin>>vexs[i];
j++;
}

cout<<"输出无向图的邻接矩阵:"<<endl;

AdjMatrixUndirGraph<char> aundir(vexs,n);
for(i=0;i<n;i++)
{
for(int v=1;v<n;v++)
{
cout<<"输入Y/N,是否插入边:";
cin>>c;
if(c == 'Y' )
aundir.InsertEdge(i,v);
}
}
Display(aundir);

cout<<"请输入有向图的顶点个数m:";
cin>>m;
for(int a=0;a<m;a++)
{
cout<<"输入第"<<b<<"个顶点数据";
cin>>nums[a];
b++;
}

AdjListDirGraph<char> dir(nums,m);

for(int k=0;k<m;k++)
{
for(e=0;e<m;e++)
{
cout<<"是否插入边V"<<k<<",V"<<e<<":";
cin>>c;
if(c == 'Y' )
dir.InsertEdge(k,e);
}
}
Display(dir);

cout<<"无向图的深度遍历:";
DFSTraverse<char>(aundir,Write<char>);
cout<<endl;
cout<<"无向图的广度遍历:";
BFSTraverse<char>(aundir,Write<char>);

cout<<endl;
cout<<"有向图的深度遍历:";
DFSTraverse<char>(dir,Write<char>);
cout<<endl;
cout<<"有向图的广度遍历:";
BFSTraverse<char>(dir,Write<char>);

‘伍’ (1) 图的建立,要求采用邻接矩阵作为存储结构。 (2) 输出结点的度(或出度和入度),并求得图的边数。

就指针变量和一般变量本身而言,没有区别。
但给指针变量申请分配内存时,申请到的内存是从内存堆空间申请的。而指针变量和一般变量则在在内存栈空间,由系统自动分配的。

‘陆’ 有向图的邻接矩阵存储

有向图的邻接矩阵,用类似于二维链表做过,下面是c++的代码:

//顶点结构
structVexNode
{
chardata;
ArcNode*firstarc;
};
//弧结构
structArcNode
{//邻接顶点的下标
intadjvex;
ArcNode*nextarc;
};

classAdjList
{
private:
VexNodedata[100];
intvn,an;//顶点数弧数
public:
//构造函数以及其他的一些函数
AdjList();
virtual~AdjList();
};

‘柒’ 采用邻接矩阵存储结构对有向图进行拓扑排序的算法

lint topsort( ALGraph *G) /*拓扑排序*/
{ int i,j,k,top =-1;
EdgeNode *ptr;
for(i=0;i<G->n;i++) /*入度为0入栈*/
{ if(G->adjlist[i].indegree==0)
{ G->adjlist[i].indegree=top;
top=i; }
}
{if(top==-1) return -1; /*网中有回路*/
j=top;
for(i=0;i<G->n;i++)
{ if(top==-1) return -1;/*AOV网中有回路*/
j=top;
top=G->adjlist[top].indegree; /*从栈中退出一个入度为0的顶点并输出*/
printf("->%s",G->adjlist[j].vertex);
ptr=G->adjlist[j].firstedge;
{ k=ptr->adjvex;
G->adjlist[k].indegree--; /*修改其他顶点的入度*/
if(G->adjlist[k].indegree==0) /*为0入栈*/
while(ptr!=NULL)
{
G->adjlist[k].indegree=top;
top=k;
}
ptr=ptr->next;
}
}
}

‘捌’ 设计一个采用邻接矩阵存储结构的图类MGraph及深度优先遍历非递归算法。

你是要整个代码还是要关键程序段?
我这边的程序接口你也许不能用。
请详细说明。

‘玖’ 若具有n个顶点的无向图采用邻接矩阵存储方法,该邻接矩阵一定为一个什么矩阵

原则上的确是n的平方,不过由于无向图的邻接矩阵是一个对称矩阵,只需要存储下三角或者上三角的元素,个数就是从1加到n,就是n(n+1)/ 2,这是压缩存储,是用一维数组存放,一般好像不叫矩阵。

其实更精确地说,上面的数字个数是普通对称矩阵的,这个邻接矩阵的对角线一定为0,所以,只需要存储1加到n-1,也就是n(n-1)/2就可以了。

用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。

(9)假设图采用邻接矩阵存储扩展阅读:

对无向图而言,邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图),副对角线不一定为0,有向图则不一定如此。

在无向图中,任一顶点i的度为第i列(或第i行)所有非零元素的个数,在有向图中顶点i的出度为第i行所有非零元素的个数,而入度为第i列所有非零元素的个数。

用邻接矩阵法表示图共需要n^2个空间,由于无向图的邻接矩阵一定具有对称关系,所以扣除对角线为零外,仅需要存储上三角形或下三角形的数据即可,因此仅需要n(n-1)/2个空间。

‘拾’ 用邻接矩阵储存图,所占用的储存空间大小只与图中顶点个数

图的邻接矩阵存储所占用空间大小只与顶点个数有关,更准确地说,设顶点n个,则与n^2成正比(n的平方)