数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解

本系列博客为《数据结构》(C语言版)的学习笔记(上课笔记),仅用于学习交流和自我复习


数据结构合集链接: 《数据结构》C语言版(严蔚敏版) 全书知识梳理(超详细清晰易懂)

在这里插入图片描述

一、 图的基本定义和术语

一.图的基本概念

图(graph)并不是指图形图像(image)或地图(map)。通常来说,我们会把图视为一种由“顶点”组成的抽象网络,网络中的各顶点可以通过“边”实现彼此的连接,表示两顶点有关联。注意上面图定义中的两个关键字,由此得到我们最基础最基本的2个概念,顶点(vertex)和边(edge)。
在这里插入图片描述
如上图所示,节点(vertex)用红色标出,通过黑色的边(edge)连接。

1.度

与结点关联的边数,在有向图中为入度与出度之和。

  • 出度:在有向图中以这个结点为起点的有向边的数目。(可形象的理解为离开这个结点的边的数目)

  • 入度:在有向图中以这个结点为终点的有向边的数目。(可形象的理解为进入/指向这个结点的边的数目)

任意一个图的总度数等于其边数的2倍

2.连通

如果在同一无向图中两个结点存在一条路径相连,则称这两个结点连通。

(1)连通图

如果无向图中任意两个结点都是连通的,则称之为连通图。

(2)强连通/强连通图

如果有向图中任意两个结点之间存在两条路径(即(i,j)两点中,既从i到j有一条路径,j到i也有一条路径),则两点是强连通的。当一个图中任意两点间都是强连通的,则该图称之为强连通图。

在强连通图中,必定有一条回路经过所有顶点。

强连通分量:非强连通图有向图中的最大子强连通图。

3.回路

起点与相同的路径,又叫“环”。

4.完全图

任意两点间都存在边使其相连的无向图或任意两点间都存在两条不同边的有向图称作完全图

N个顶点的完全图:

有向 有n(n-1)条边
无向 有n(n-1)/2条边

在这里插入图片描述
在这里插入图片描述
完全图:任意两个点都有一条边相连

无向完全图

n个结点,一共有 C ( n , 2 ) C(n,2) C(n,2)条边

有向完全图

n ( n − 1 ) n(n-1) n(n1)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、图的三种存储结构

1.邻接矩阵表示法

所谓邻接矩阵存储结构就每个顶点用一个一维数组存储边的信息,这样所有点合起来就是用矩阵表示图中各顶点之间的邻接关系。所谓矩阵其实就是二维数组。

int g[N][N];
int main() {
	int n, m; //n个点 m条边 
	scanf("%d%d", &n, &m);
	int u, v; //从u到v
	for (int i = 0; i < m; ++i) {
		scanf("%d%d", &u, &v);
		g[u][v] = 1; 
		//g[v][u] = 1;//无向图要建双边 
		//g[u][v] = w; //带权图
	} 
}

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.邻接表(链式)表示法

邻接表:

#include<bits/stdc++.h>
using namespace std;
#define debug(x) cout<<"#  "<<x<<" "<<endl;
typedef long long ll;
const ll mod=2147483647;
const ll N=1e4+7;
vector<ll>G[N];//graph
/*
如果边上有属性(带权图)
struct edge
{
    ll to,cost;
};
vector<edge>G[N];
*/
int main()
{
    ll V,E;//V个顶点和E条边
    scanf("%lld %lld",&V,&E);
    for(int i=0;i<E;++i)
    {
        ll s,t;//从s到t
        scanf("%lld %lld",&s,&t);
        G[s].push_back(t);
    }
    /*
    **********各种对图的操作    
    */
    return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#define MVNum 100                        	//最大顶点数 
typedef struct ArcNode{                		//边结点 
    int adjvex;                          		//该边所指向的顶点的位置 
    struct ArcNode * nextarc;          	//指向下一条边的指针 
    OtherInfo info;                      	              //和边相关的信息 
}ArcNode; 
typedef struct VNode{ 
    VerTexType data;                    	//顶点信息 
    ArcNode * firstarc;                	//指向第一条依附该顶点的边的指针 
}VNode, AdjList[MVNum];               	//AdjList表示邻接表类型 
typedef struct{ 
    AdjList vertices;                 		//邻接表 
    int vexnum, arcnum;              		//图的当前顶点数和边数 
}ALGraph; 

优点 :空间效率高,容易寻找顶点的邻接点;

缺点 :判断两顶点间是否有边或弧,需搜索两结点对应的单链表,没有邻接矩阵方便。

3.邻接矩阵和邻接表的区别

在这里插入图片描述
在这里插入图片描述

4.链式前向星

如果说邻接表是不好写但效率好,邻接矩阵是好写但效率低的话,前向星就是一个相对中庸的数据结构。前向星固然好些,但效率并不高。而在优化为链式前向星后,效率也得到了较大的提升(主要是看着舒服)。

struct node
{
    int v,nex,val,u;
}e[N];

int head[N],cnt;

inline void add(int u,int v,int val)//从u到v,从父节点到子节点
{
    e[++cnt].nex=head[u];
    e[cnt].val=val;//可有可无
    e[cnt].v=v;
    e[cnt].u=u;//可有可无
    head[u]=cnt;
}

遍历所有结点方法:

for(int i=head[u];i;i=e[i].nex)
    {
        int v=e[i].v;
        ---------------
    }

//这样我们就可以遍历全部的点了!!

三、图的遍历

搜索引擎的两种基本抓取策略 —深度优先/广度优先

两种策略结合=先广后深 +权重优先

先把这个页面所有的链接都抓取一次再根据这些URL的权重来判定URL的权重高,就采用深度优先,URL权重低,就采用宽度优先或者不抓取 。

我把我之前写的博客的内容全部直接搬过来啦 ,下面的可能会有点难度
0x21.搜索 - 树与图的遍历、拓扑排序

注:以下图的建立都是使用链式前向星建图。

int head[N],ver[N],nex[N],edge[N],tot;

void add(int u,int v,int val){//链式前向星建图
    ver[++tot] = v;
    edge[tot] = val;
    nex[tot] = head[u];
    head[u] = tot;
}

1.)树与图的深度优先遍历及树的一些性质

1.树与图的深度优先遍历

深度优先遍历,就是在每个点x上面的的多条分支时,任意选择一条边走下去,执行递归,直到回溯到点x后再走其他的边

int vis[N];//标记每一个点的状态

void dfs(int u){
    vis[u] = 1;
    for(int i = head[u];i;i = nex[i]){
        int v = ver[i];
        if(vis[v])
            continue;
        dfs(v);
    }
}

注:下面的2,3,4,5,6小节的内容不要求掌握,我就是看着有关联就放到这里的,都是竞赛相关的内容,有兴趣可以看一下,都比较简单

2.时间戳

按照上述的深度优先遍历的过程,以每一个结点第一次被访问的顺序,依次赋值1~N的整数标记,该标记就被称为时间戳。
标记了每一个结点的访问顺序。

3.树的DFS

一般来说,我们在对树的进行深度优先时,对于每个节点,在刚进入递归时和回溯前各记录一次该点的编号,最后会产生一个长度为 2 N 2N 2N的序列,就成为该树的 D F S DFS DFS序。

int a[N],cnt;
int dfs(int u){
     a[++cnt] = u;//用a数组存DFS序
     vis[u] = 1;
     for(int i = head[u]; i;i = nex[i]){
        int v = ver[i];
        if(vis[v])
            continue;
        dfs(v);
     }
     a[++cnt] = u;
}

D F S DFS DFS序的特点时:每个节点的 x x x的编号在序列中恰好出现两次。设这两次出现的位置时 L [ x ] , R [ x ] L[x],R[x] L[x],R[x],那么闭区间 [ L [ x ] , R [ x ] ] [L[x],R[x]] [L[x],R[x]]就是以 x x x为根的子树的 D F S DFS DFS序。
dfs序可以把一棵树区间化,即可以求出每个节点的管辖区间。
对于一棵树的dfs序而言,同一棵子树所对应的一定是dfs序中连续的一段。
在这里插入图片描述
在这里插入图片描述
放一个博客。
dfs序的七个基本问题

4.树的深度

树中各个节点的深度是一种自顶向下的统计信息

起初,我们已知根节点深度是 0 0 0.若节点x的深度为 d [ x ] d[x] d[x],则它的子结点 y y y 的深度就是 d [ y ] = d [ x ] + 1 d[y]=d[x]+1 d[y]=d[x]+1


int dep[N];
void dfs(int u){
	vis[u] = 1;
	for(int i = head[u];i;i = nex[i]){
		int v = ver[i];
		if(vis[v])
			continue;
		dep[v] = dep[u]+1;//父结点 u 到子结点 v  递推 
		dfs(v);
	}
}

5.树的重心与 s i z e size size

树的重心是自底向上统计的
树的重心也叫树的质心。对于一棵树n个节点的无根树,找到一个点,使得把树变成以该点为根的有根树时,最大子树的结点数最小。

【树形DP】树的重心详解+多组例题详解


int vis[N];
int Size[N];
int ans = INF;
int id;
void dfs(int u){
    vis[u] = 1;
    Size[u] = 1;//子树的大小
    int max_part = 0;
    for(int i = head[u];i;i = nex[i]){
        int v = ver[i];
        if(vis[v])
            continue;
        dfs(v);
        Size[u] += Size[v];
        max_part = max(max_part,Size[v]);//比较儿子的size因为这里是假设以u为重心
    }
    max_part = max(max_part,n-Size[u]);//n为整棵树的结点数
    if(max_part<ans){//更新
        ans = max_part;//记录重心对应的max_part的值
        id = u;//记录重心位置
    }
}

6.图的连通块划分

若在一个无向图中的一个子图中任意两个点之间都存在一条路径(可以相互到达),并且这个子图是“极大的”(不能在扩展),则称该子图是原图的一个联通块

如下代码所示,cnt是联通块的个数,v记录的是每一个点属于哪一个联通块
经过连通块划分,可以将森林划分出每一颗树,或者将图划分为各个连通块。

int cnt;
void dfs(int u){
    vis[u] = cnt;//这里存的是第几颗树或者是第几块连通图
    for(int i = head[u];i;i = nex[i]){
        int v = ver[i];
        if(vis[v])
            continue;
        dfs(v);
    }
}
int main()
{
    for(int i = 1;i<=n;++i){
        if(!vis[i])//如果是颗新树就往里面搜
            ++cnt,dfs(i);
    }
}

DFS算法效率分析

用邻接矩阵来表示图,遍历图中每一个顶点都要从头扫描该顶点所在行,时间复杂度为 O ( n 2 ) O(n^2) O(n2)

用邻接表来表示图,虽然有 2e 个表结点,但只需扫描 e 个结点即可完成遍历,加上访问 n个头结点的时间,时间复杂度为 O ( n + e ) O(n+e) O(n+e)

结论:
稠密图适于在邻接矩阵上进行深度遍历;

稀疏图适于在邻接表上进行深度遍历。

2.)树与图的广度优先搜索

树与图的广度优先遍历,顺便求d数组(树结点的深度/图结点的层次)。

void bfs(){
    memset(d,0,sizeof d);
    queue<int>q;
    q.push(1);
    d[1] = 1;
    while(q.size()){
        int u = q.front();
        q.pop();
        for(int i = head[u];i;i = nex[i]){
            int v = ver[i];
            if(d[v])continue;
            d[v] = d[u]+1;
            q.push(v);
        }
    }
}

广度优先遍历是一种按照层次顺序访问的方法。
它具有两个重要的性质:

  1. 在访问完所有的第i层结点后,才会访问第i+1层结点。
  2. 任意时刻,队列中只会有两个层次的结点,满足“两段性”和“单调性”。

BFS算法效率分析

如果使用邻接矩阵,则BFS对于每一个被访问到的顶点,都要循环检测矩阵中的整整一行( n 个元素),总的时间代价为 O ( n 2 ) O(n^2) O(n2)

用邻接表来表示图,虽然有 2e 个表结点,但只需扫描 e 个结点即可完成遍历,加上访问 n个头结点的时间,时间复杂度为 O ( n + e ) O(n+e) O(n+e)

练习
在这里插入图片描述
答案:
深度:3,6,5,1,2,4
广度:3,6,2,5,1,4

四、图的应用

本ACMer狂喜

1.最小生成树

极小连通子图:该子图是G 的连通子图,在该子图中删除任何一条边,子图不再连通。
生成树:包含图G所有顶点的极小连通子图(n-1条边)。
在这里插入图片描述
在这里插入图片描述
首先明确:

  1. 使用不同的遍历图的方法,可以得到不同的生成树

  2. 从不同的顶点出发,也可能得到不同的生成树。

  3. 按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点、n-1 条边。

目标:
在网的多个生成树中,寻找一个各边权值之和最小的生成树。

K r u s k a l Kruskal Kruskal算法可以简单理解为按边贪心。
P r i m Prim Prim算法是以更新过的节点的连边找最小值

Prim算法适用于稠密图
Kruskal适用于稀疏图

1. K r u s k a l Kruskal Kruskal算法

每次选择权值最小的边,若该边两点没有加入集合,就将他加入。
起初每个点的都是一个独立的集合,把边权从小到达排序,按照边权枚举边,用并查集判断两个是否在同一个集合,如果在一个集合就跳过当前边,反之就联通这两个集合。
时间复杂度: O ( m l o g m ) O(mlogm) O(mlogm)
给出C++代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<vector>

#define over(i,s,t) for(register int i = s;i <= t;++i)
#define lver(i,t,s) for(register int i = t;i >= s;--i)
//#define int __int128
#define lowbit(p) p&(-p)
using namespace std;

typedef long long ll;
typedef pair<int,int> PII;
const int N = 2e5+7;

struct node{
    int x,y,z;
    bool operator<(node &t)const{
        return z < t.z;
    }
}edge[N];

int fa[N],n,m,ans;

int Find(int x){
    if(x == fa[x])return x;
    return fa[x] = Find(fa[x]);
}

int main()
{
    cin>>n>>m;
    over(i,1,m)
    scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].z);
    sort(edge + 1,edge + 1 + m);
    over(i,1,n)
    fa[i] = i;
    over(i,1,m){
        int x = Find(edge[i].x);
        int y = Find(edge[i].y);
        if(x == y)continue;
        fa[x] = y;
        ans += edge[i].z;
    }
    printf("%d\n",ans);
}

2. P r i m Prim Prim算法

每次选择当前点所连的边的最小值,然后把它连起来
有些类似 D i j k s t r a Dijkstra Dijkstra就是一个
普通版本的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
堆优化的算法时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
给出C++代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<vector>
#include<queue>

#define over(i,s,t) for(register int i = s;i <= t;++i)
#define lver(i,t,s) for(register int i = t;i >= s;--i)
//#define int __int128
#define lowbit(p) p&(-p)
using namespace std;

typedef long long ll;
typedef pair<int,int> PII;
const int N = 4e5+7;

int ver[N],nex[N],edge[N],head[N],tot;
int n,m,ans;
int dis[N];
int vis[N],cnt;
void add(int u,int v,int val){
    ver[++tot] = v;
    edge[tot] = val;
    nex[tot] = head[u];
    head[u] = tot;
}

priority_queue<PII,vector<PII>,greater<PII> >q;

void prim(){
    dis[1] = 0;
    q.push({0,1});
    while(q.size()&&cnt != n){
        int d = q.top().first,u = q.top().second;
        q.pop();
        if(vis[u])continue;
        cnt++;
        ans += d;
        vis[u] = 1;
        for(int i = head[u];i;i = nex[i]){
            int v = ver[i];
            if(edge[i] < dis[v])
                dis[v] = edge[i],q.push({dis[v],v});
        }
    }
}

int main()
{
    memset(dis,0x3f,sizeof dis);
    scanf("%d%d",&n,&m);
    over(i,1,m){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);
    }
    prim();
    printf("%d\n",ans);
    return 0;
}

2.最短路算法

1.Dijkstra算法

经典的最短路算法,基于贪心思想的,适用于非负权值图的经过优先队列或者线段树优化后的 O ( m l o g n ) O(mlogn) O(mlogn)的优秀算法。(m是边数,n是点数)

其实也超级简单,就是从起点开始,用一个dis数组存从起点到每一个点的最短距离,每次在当前点更新dis数组(可能经过当前点u到达的v点的总距离dis[u]+edge[v]是小于dis[v]就更新),然后往下走。
最后得到一个dis数组。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后就是代码了。
Dijkstra算法时间复杂度为 O ( n m ) O(nm) O(nm),算法瓶颈是每次查找值最小的路径,下面代码使用优先队列,直接实现自动排序,将整个算法的时间复杂度优化到 O ( m l o g n ) O(mlogn) O(mlogn),普通的C语言写法可以写一个循环, O ( n ) O(n) O(n)来每次查找当前点的最小路径。

#include<bits/stdc++.h>
using namespace std;
#define debug(x) cout<<"#  "<<x<<" "<<endl;
typedef long long ll;
const ll mod=2147483647000;
const ll N=500007;
struct Edge
{
    ll v,w,next;//v:目的地,w:距离,next:下一个节点
}G[N];
ll head[N],cnt,n,m,s;
ll dis[N];//存距离
inline void addedge(ll u,ll v,ll w)//链式前向星存图
{
    cnt++;
    G[cnt].w=w;
    G[cnt].v=v;
    G[cnt].next=head[u];
    head[u]=cnt;
}
struct node
{
    ll d,u;//d是距离u是起点
    bool operator<(const node& t)const//重载运算符
    {
        return d>t.d;
    }
};
inline void Dijkstra()
{
    for(register int i=1;i<=n;++i)dis[i]=mod;//初始化
    dis[s]=0;
    priority_queue<node>q;//堆优化
    q.push((node){0,s});//起点push进去
    while(!q.empty())
    {
        node tmp=q.top();q.pop();
        ll u=tmp.u,d=tmp.d;
        if(d!=dis[u])continue;//松弛操作剪枝
        for(register int i=head[u];i;i=G[i].next)//链式前向星
        {
            ll v=G[i].v,w=G[i].w;
            if(dis[u]+w<dis[v])//符合条件就更新
            {
                dis[v]=dis[u]+w;
                q.push((node){dis[v],v});//沿着边往下走
            }
        }
    }
}
int main()
{
    scanf("%lld %lld %lld",&n,&m,&s);
    for(register int i=1;i<=m;++i)
    {
        ll x,y,z;
        scanf("%lld %lld %lld",&x,&y,&z);
        addedge(x,y,z);//建图
    }
    Dijkstra();
    for(register int i=1;i<=n;++i)
        printf("%lld ",dis[i]);
    printf("\n");
    return 0;
}

3.拓扑排序

4.关键路径

我根据自己的理解改了一点ppt
这里的关键路径实际上跟最短路正好相反。
这里每到达一个结点(事件)就必须要花所有指向该结点的边的权值最大(活动可以同时进行),即所有边(活动)都完成才能触发该事件。
在这里插入图片描述
在这里插入图片描述
计算其实非常简单,算好 V e ( j ) Ve(j) Ve(j)(取最大值)和 V l ( j ) V l (j) Vl(j)(取最小值),关键是把握好下面的公式:
事件的最早发生时间 ( V e ( j ) ) (Ve(j)) Ve(j)
事件的最迟发生时间 ( V l ( j ) ) (V l (j)) Vl(j)
活动的最早开始时间: e ( a i ) = V e ( j ) e( ai ) = Ve( j ) e(ai)=Ve(j)
活动的最迟开始时间: l ( a i ) = V l ( k ) − d u t ( j , k ) l( ai ) = V l( k ) - dut( j , k ) l(ai)=Vl(k)dut(j,k)
在这里插入图片描述
然后就是我最喜欢的代码环节了:

实例:求事件结点的最早发生时间

Status  Topologicalsort( ALGraph G,  Stack &T)
{  FindinDegree(G,indegree);       // 对各顶点求入度,建立入度为零的栈 S,
Initstack(T);count = 0;
    ve [ 0 .. G.vexnum - 1 ] = 0;
while (!StackEmpty(S))
       {  Pop(S,j);Push(T,j); ++count;
           for (p=G.vertices[i]. firstarc; p; p=p->nextarc);
	{ k = p->adjnexr;
	   if!- - indegree [ k ])) Push(S, k);
	   if (ve[ j ]+ *( p->info)> ve[  k ] )
                               ve[ k ]  = ve[ j ] +  *( p->info); }
                     }
        }
     if (count < G.vexnum)return ERROR;
     else return OK;
} //  栈 T 为求事件的最迟发生时间的时候用。

实例:求事件结点的最迟发生时间

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

五、作业习题详解

1.选择判断

1.下面( )方法可以判断出一个有向图是否有环。 (2分)
A.深度优先遍历
B.拓扑排序
C.求最短路径
D.求关键路径

答案:B

对于有向图的拓扑排序,

  1. 计算图中所有点的入度,把入度为0的点加入栈
  2. 如果栈非空:取出栈顶顶点a,输出该顶点值,删除该顶点
  3. 从图中删除所有以a为起始点的边,如果删除的边的另一个顶点入度为0,则把它入栈
  4. 如果图中还存在顶点,则表示图中存在环;否则输出的顶点就是一个拓扑排序序列

2.在图采用邻接表存储时,求最小生成树的Prim算法的时间复杂度为()
A. O ( n ) O(n) O(n)
B. O ( n + e ) O(n+e) O(n+e)
C. O ( n 2 ) O(n^2) O(n2)
D. O ( n 3 ) O(n^3) O(n3)

Prim算法的时间复杂度

邻接表存储 O ( n + e ) O(n+e) O(n+e)
邻接矩阵 O ( n 2 ) O(n^2) O(n2)

3.图中有关路径的定义是

A.由顶点和相邻顶点序偶构成的边所形成的序列
B.由不同顶点所形成的序列
C.由不同边所形成的序列
D.上述定义都不是

答案:A

A(正确). 序偶:两个具有固定次序的客体组成一个序偶。由顶点和相邻顶点序偶构成的边的序列-----一条边对应两个端点,每条边的两个端点之间都有序偶关系----则一系列边的序列,构成有次序关系的一系列顶点的序列-----路径的定义:一个vp vi1 vi2 … vq的顶点序列就是一条路径。 所以很清楚了,A的确能反映路径。

B. 路径分为简单路径和复杂路径,该选项只是简单路径的性质。

C. 这一系列的边之间是否有连接关系?如果只是很多不相连的线段呢?

4.若从无向图的任意一个顶点出发进行一次深度优先搜索可以访问图中所有的顶点,则该图一定是( )图。
A.非连通 B.连通 C.强连通 D.有向

答案:B
解释:即从该无向图任意一个顶点出发有到各个顶点的路径,所以该无向图是连通图。
强连通图是指的所有的点都连通。
5.n个顶点的连通图用邻接距阵表示时,该距阵至少有( )个非零元素。
A.n B.2(n-1) C.n/2 D.n2

答案:B

6.关键路径是事件结点网络中( )。 (2分)
A.从源点到汇点的最长路径
B.从源点到汇点的最短路径
C.最长回路
D.最短回路
答案:A
关键路径在实际应用中被当做“参考路径”,即deadline 长度最长的路径

7.下列关于AOE网的叙述中,不正确的是( )。
A.所有的关键活动提前完成,那么整个工程将会提前完成
B.关键活动不按期完成就会影响整个工程的完成时间
C.任何一个关键活动提前完成,那么整个工程将会提前完成
D.某些关键活动提前完成,那么整个工程将会提前完成

答案:C

2.编程题

数据结构 习题 综合复习
TXYGoodluck的博客
07-01 2646
最近在复习数据结构,所以把做的习题做个总结加小知识点,如果大家有遇到这方面的问题就可以参考一下了,废话不多说,直接开始吧。 1.从一个长度为n的顺序表中删除第i个元素(1<= i <= n)时,需向前移动 (n - i)个元素。 2.对于一个具有n个顶点的无向连通,它包含的连通分量的个数为( 1 )。 在无向G中,若从顶点Vi到顶点Vj有路径(当然从Vj到Vi也一定有路径),则称 Vi和Vj 是联通的。若V(G)中任意两个不同的顶点Vi 和Vj都联通(即有路径),则称G为连通。 无向
数据结构C语言) 第 知识梳理 + 习题详解1
08-03
1.度 2.连通 3.回路 4.完全 1.邻接矩阵表示法 2.邻接表(链式)表示法 3.邻接矩阵和邻接表的区别 4.链式前向星 1.)树与的深度优先遍历及树
【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了
帅地
01-18 10万+
由于文有点多,并且发的文也不是一个系列一个系列发的,不过我的文大部分都是围绕着 数据结构 + 算法 + 计算机网络 + 操作系统 + Linux + 数据库 这几个方面发的,为了方便大家阅读,我整理了一波。不过公众号可以说是不支持修改文,因为我决定每两三个月就整理一次,会非常详细着按照类别整理出来哦,并且也给出了目录哦。大家记得多看看哦,好多文都是面试中常问滴 文目录一、经验/经历/所...
数据结构(C语言)第:
weixin_34220963的博客
12-23 385
为什么80%的码农都做不了架构师?>>> ...
严蔚敏《数据结构(c语言)习题集》答案第树和二叉树文库.pdf
09-30
严蔚敏《数据结构(c语言)习题集》答案第树和二叉树文库.pdf
c语言数据结构题库,数据结构c语言相关节题库
weixin_36073697的博客
05-24 1140
第一 绪论一、选择题1、数据结构是一门研究非数值计算的程序设计问题中计算机的 ① 以及它们之间的 ② 和运算等的学科。(易) ① A、数据元素 B、计算方法 ② A、结构B、关系C、逻辑存储 D、数据映象 C、运算D、算法2、数据结构被形式地定义为(K,R),其中K是 ① 的有限集,R是K上的 ② 有限集。(易) ① A、 算法 B、...
数据结构C语言) 第八 排序 知识梳理 + 习题详解1
08-03
七、第七作业答案本系列博客为《数据结构》(C语言)的学习笔记(上课笔记),仅用于学习交流和自我复习数据结构合集链接: 《数据结构C语言(严蔚敏) 全书
数据结构C语言) 第一 绪论 知识梳理 + 作业习题详解1
08-03
一、数据结构C语言) 第1 绪论二、作业习题本系列博客为《数据结构》(C语言)的学习笔记(上课笔记),仅用于学习交流和自我复习数据结构合集链接: 《数据
数据结构C语言) 第二 线性表 知识梳理+作业习题详解1
08-03
1.样例引入:多项式相加 1.前插法代码实例 2.链表尾插法完整代码附带各种操作 1.双向链表的插入 2.双向链表的删除 1.直接合并 1.样例引入:多项式相加
数据结构C语言) 第五 树与二叉树 知识梳理 + 作业习题详解1
08-04
2.有序树和无序树 3.森林 4.树的基本性质 1.先序遍历 2.中序遍历 3.后序遍历 4.层序遍历 1.二叉树的建立 2.计算二叉树结点总数 3.计算二叉树
数据结构题库知识点汇总
flysnownet的博客
03-21 3913
第一 绪论 一.填空题 1. 数据结构包括数据的逻辑结构、数据的存储结构和数据的运算。 2. 数据的逻辑结构可以分为线性 和非线性 两大类型。 3. 在算法正确的前提下,评价一个算法好坏的两个主要标准是时间复杂度 和空间复杂度 。 4. 对于给定的n个元素,可以构造出的逻辑结构有线性、树形 、形 和集合 四种。 5. 数据的存储结构不仅有顺序存储结构、链式存储结构,还有索引存储结构 和散列存储结构 。 6. 组成数据的基本单位是数据元素 。 7. 数据结构的两...
【最详细】数据结构C语言 第2)第课后习题答案 严蔚敏 等 编著
weixin_43899069的博客
11-02 5万+
1.选择题 ( 1)在一个中,所有顶点的度数之和等于的边数的()倍。 A. 1/2 B. 1 C. 2 D. 4 答案: C ( 2)在一个有向中,所有顶点的入度之和等于所有顶点的出度之和的()倍。 A. 1/2 B. 1 C. 2 D. 4 答案: B 解释:有向所有顶点入度之和等于所有顶点出度之和。 ( 3)具有 n 个顶点的有向最多有()条边。 A. n B . n(n-1) C. n(n+1) D . n2 答案: B 解释:有向的边有方向之分, 即为从 n 个顶点中选取 2 个顶点有序
数据结构C语言 第2)课后习题答案 严蔚敏 编著
热门推荐
qq_42777804的博客
09-11 25万+
  转自 https://blog.csdn.net/Bamboo_shui/article/details/72433523    (原文没第八答案) 数据结构C语言 第2)课后习题答案 严蔚敏 等 编著,仅供参考,还是自己认真做了再看 第1  绪论   5.选择题 (1)在数据结构中,从逻辑上可以把数据结构分成(  C )。 A.动态结构和静态结构     B.紧凑...
数据结构(c语言)第答案,数据结构C语言) 第 知识梳理 + 习题详解...
weixin_32019577的博客
05-18 1511
本系列博客为《数据结构》(C语言)的学习笔记(上课笔记),仅用于学习交流和自我复习html 1、 的基本定义和术语彻底:任意两个点都有一条边相连ios无向彻底webn个结点,一共有C(n,2)C(n,2)C(n,2)条边算法有向彻底数组n(n−1)n(n-1)n(n−1)网络 2、的三种存储结构1.邻接矩阵表示法所谓邻接矩阵存储结构就每一个顶点用一个一维数组存储边的信息,这样全部点合起...
数据结构C语言)第 树和二叉树-整理-6.1
Glitter_N的博客
11-19 739
6.1 树的定义和基本术语 树是n(n>=0)个结点的有限集。 在任意一棵非空树中: 有且仅有一个特定的称为根(Root)的结点 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每一个集合本身又是一棵树,并且称为根的子树。 表示形式: 嵌套集合 冠以表 凹入表示法 树的基本术语: 结点:包含一个数据元素及若干指向其子树的分支 结点的度:结点拥有的子树数 叶子或终端结点:度为0的结点 非终端结点或分支结点:度不为0的结点 树的度:树内个结点的度的
UVA-10935 Throwing cards away I
努力写代码的小柯基的博客
08-23 131
#include<iostream> #include<algorithm> #include<cmath> #include<iomanip> #include<string> #include<cassert> #include<cctype> #include<memory.h> #include<cstdio> #include<sstream> #include<vect.
Apple Tree树状数组、前向星、DFS序(C语言)
tblwbr520的博客
11-26 171
Apple Tree树状数组、前向星、DFS序(C语言) 题目 输入值 第一行包含一个整数Ñ(Ñ ≤100,000),这是树中的叉的数量。 接下来的N -1行分别包含两个整数u和v,这意味着fork u和fork v通过分支连接。 下一行包含的整数中号(中号≤100,000)。 以下中号行,每行包含一个消息,该消息或者是 “ Ç X ”,这意味着苹果上叉存在X已经变了。例如,如果叉子上有一个苹果,则卡卡(Kaka)摘下;否则,空叉上会长出一个新苹果。 或 “ Q x ”,表示查询叉子x上方子树中的苹果数量,
#define总结-#define用法集锦 (网上资料汇集)
jernymy的专栏
11-13 7407
 Definition:The #define Directive  You can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are:   Syntax  #define identifier to
数据结构(廿一) -- C语言 -- - 的基本概念
青椒*^_^*凤爪爪的博客
07-26 9977
(Graph)是一种较线性表和树更为复杂的数据结构,在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中 ,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即其孩子节点)相关 但只能和上一层中一个元素(即其双亲节点) 相关,而在形结构中,结点之间的关系可以是任意的 ,中任意两个数据元素之间都可能相关。
严蔚敏数据结构
最新发布
08-18
在严蔚敏的《数据结构》第中,我没有找到与你提供的引用内容相关的答案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [数据结构C语言 第2)课后习题答案 严蔚敏 编著](https://download.csdn.net/download/fish8245/14917201)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数据结构C语言) 第 知识梳理 + 习题详解](https://blog.csdn.net/weixin_45697774/article/details/106326102)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 《数据结构》C语言版(清华严蔚敏考研版) 全书知识梳理 + 练习习题详解(超详细清晰易懂) 218225
  • 线段树 从入门到进阶(超清晰,简单易懂) 74932
  • 数据结构(C语言版) 第二章 线性表 知识梳理+作业习题详解 61430
  • 数据结构(C语言版) 第一章 绪论 知识梳理 + 作业习题详解 53522
  • 数据结构(C语言版 第2版严蔚敏版)完整课后习题答案汇总 50788

分类专栏

  • 《繁凡的深度学习笔记》 5篇
  • 《繁凡的对抗攻击论文精读》 3篇
  • 《算法全家桶》 21篇
  • 《ACM模板》 81篇
  • 《数据结构》(C语言版)总结 9篇
  • 《算法竞赛中的初等数论》 10篇
  • 千题复习计划 1篇
  • BZOJ 计划 24篇
  • 【解题报告】- 超高质量题单 + 题解 25篇
  • Deep Learing 深度学习 1篇
  • Meta Learing 元学习 2篇
  • 大数据可视化
  • 考研408 2篇
  • 红书《题目与解读》 3篇
  • 《小学生都能看懂系列》 4篇
  • 【算法笔记】合集 42篇
  • 《算法竞赛进阶指南》学习笔记 42篇
  • 每日亿题 30篇
  • ACM - ICPC 真题 23篇
  • Codeforces 比赛题解 28篇
  • Luogu洛谷比赛题解 3篇
  • NowCoder牛客比赛题解 7篇
  • AtCoder比赛题解 3篇
  • AcWing课程/洛谷题单刷题总结 29篇
  • 第一章 动态规划 5篇
  • 第二章 搜索 4篇
  • 第三章 图论 13篇
  • 第四章 高级数据结构 3篇
  • 第五章 数学知识 9篇
  • 第六章 计算几何 1篇
  • 【死亡思维题】 19篇
  • 【小技巧合集】 9篇
  • kuangbin专题合集 5篇
  • 【STL】 4篇
  • 【ACM—ICPC 相关】 15篇
  • 《线性代数》算法竞赛相关 12篇
  • 多项式 - 分治FFT 2篇
  • 多项式 - 求值与插值 6篇
  • 多项式 - 多项式问题 5篇
  • 多项式 - 多项式的各种运算 10篇
  • 多项式 - FWT / FMT / FMI 9篇
  • 多项式 - 各种乘法(FFT、NTT、MTT) 9篇
  • 几何 - 二维几何基础 13篇
  • 几何 - 三维几何基础 1篇
  • 几何 - 二维几何常用算法 6篇
  • 构造 5篇
  • 网络流 - 线性规划与网络流24题 11篇
  • 网络流 - 最大流 16篇
  • 网络流 - 最小割 9篇
  • 网络流 - 费用流 8篇
  • 网络流 - 上下界网络流 1篇
  • 图论 - 技巧、拆点、建图 5篇
  • 图论 - 树上启发式合并 3篇
  • 图论 - 点分治 3篇
  • 图论 - 树链剖分 5篇
  • 图论 - 树hash 1篇
  • 图论 - 基环树 2篇
  • 图论 - 哈密顿问题 1篇
  • 图论 - 特殊的图(仙人掌,竞赛图,弦图) 2篇
  • 图论 - 一般图最大匹配 4篇
  • 图论 - 稳定婚姻问题 1篇
  • 图论 - 差分约束系统 3篇
  • 图论 - k短路 1篇
  • 图论 - 无向图的连通性 8篇
  • 图论 - 有向图的连通性 14篇
  • 图论 - 二分图 8篇
  • 图论 - 2 - SAT问题 5篇
  • 图论 - 负环 4篇
  • 图论 - 欧拉回路 5篇
  • 图论 - 拓扑排序 7篇
  • 图论 - 图论基础 7篇
  • 图论 - 最小生成树 9篇
  • 图论 - 最小树形图 1篇
  • 图论 - 最短路算法 26篇
  • 图论 - 树论 11篇
  • 图论 - LCA及其应用 6篇
  • 组合数学 - 矩阵树定理 2篇
  • 组合数学 - 容斥原理(Min-Max容斥) 2篇
  • 组合数学 - 组合数学与计数 11篇
  • 组合数学 - 特殊的数列 3篇
  • 组合数学 - 生成函数 8篇
  • 数学 - 离散对数 1篇
  • 数学 - 博弈论 1篇
  • 数学 - 群论(Burnside引理、Polya定理) 4篇
  • 数学 - 高次同余方程 4篇
  • 数学 - 杜教筛 7篇
  • 数学 - Dirichlet前缀和 1篇
  • 数学 - 莫比乌斯反演 30篇
  • 数学 - 整除分块 5篇
  • 数学 - 容斥原理 2篇
  • 数学 - 约数 12篇
  • 数学 - 同余 10篇
  • 数学 - 数论基础 9篇
  • 数学 - 质数 9篇
  • 概率与期望《概率论》 9篇
  • DP - 数位DP 1篇
  • DP - DAG上DP 4篇
  • DP - 线性DP 18篇
  • DP - 记忆化搜索DP 3篇
  • DP - 状态机模型 1篇
  • DP - 每日DP 13篇
  • DP - 01分数规划 2篇
  • DP - 区间DP 9篇
  • DP - 九种背包合集 15篇
  • DP - LCS,LIS 6篇
  • DP - 期望DP 3篇
  • DP - 树形DP 9篇
  • DP - 环形与后效性处理 1篇
  • DP - 状态压缩DP 7篇
  • 字符串 - AC自动机 4篇
  • 字符串 - Trie树 4篇
  • 字符串 - 字符串匹配 1篇
  • 字符串 - KMP算法 3篇
  • 字符串 - 哈希 3篇
  • 算法 - 尺取法 3篇
  • 进阶 - 折半搜索 1篇
  • “类”数据结构 - 强大的pbds和rope 4篇
  • 数据结构 - 莫队 3篇
  • 数据结构 - 可持久化数据结构 3篇
  • 数据结构 - 分块 12篇
  • 数据结构 - 平衡树 FHQ treap 8篇
  • 数据结构 - 线段树 23篇
  • 数据结构 - 树状数组 6篇
  • 数据结构 - 并查集 10篇
  • 数据结构 - 基础合集 16篇
  • 数据结构 - 单调队列 5篇
  • 数据结构 - 树与二叉树 11篇
  • 搜索算法 16篇
  • 算法基础 14篇
  • 基础 - 差分前缀和 6篇
  • 基础 - 模拟 16篇
  • 基础 - 二分法,三分法 17篇
  • 贪心算法 19篇
  • 【 Python 】 5篇
  • 【 C++ 】 13篇
  • 【 Java 】 2篇
  • 【攻略】 17篇
  • 【蓝桥杯】 3篇
  • 【学校作业】 5篇
  • SWPUOJ 12篇
  • 英语 1篇
  • 日语 3篇

最新评论

  • 【算法笔记】基环树

    陈文忻: 拓扑排序处理无向图?你确定?

  • BZOJ 2159 「国家集训队」Crash 的文明世界(第二类斯特林数,换根DP)【BZOJ计划】

    NingDream816: 还在吗

  • 【树形DP】树形DP入门详解+例题剖析

    胖柚工作室: 怎么现在看文章要收费了表情包 答主可以取消一下吗

  • 线段树 从入门到进阶(超清晰,简单易懂)

    许以衡(你在凝视什么): 但是有些小错误

  • 线段树 从入门到进阶(超清晰,简单易懂)

    许以衡(你在凝视什么): build最后少一行:tr[p]=tr[p*2]+tr[p*2+1];剩下的还有些小错误需要改正

大家在看

  • 图解Mamba——从流体力学的角度理解Mamba 1486
  • 大学生HTML期末大作业——HTML+CSS+JavaScript个人网站 1060
  • 最新版!Python所有方向的学习路线图!
  • JVM 根可达算法 453
  • AT_abc335_d [ABC335D] Loong and Takahashi 题解 1170

最新文章

  • 繁凡的对抗攻击论文精读(三)ICLR2019 利用先验知识进行高效黑盒对抗攻击的 bandits 算法(MIT)
  • 繁凡的对抗攻击论文精读(二)CVPR 2021 元学习训练模拟器进行超高效黑盒攻击(清华)
  • 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述
2022年7篇
2021年193篇
2020年513篇
2019年29篇

目录

目录

分类专栏

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁凡さん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

两个鬼故事冬天的古诗新新漫画木命人起名字啊武汉理工大学地址爱与魔法借名买房纠纷起诉状范文qq空间留言图片zquu足球论语起女孩取名全国火锅连锁加盟用改字起名字小孩子起名子姓李饭馆起名测试两个人的名字是否能在一起都市无敌特种兵方取名起名大全女孩杨振宁老婆特命战队捍卫者赵高跟嬴政是什么关系男孩八画的字起名有ghostwin8promovie神界危机5.0隐藏英雄密码起名 取名 大师水产公司起名大全三字介入布林克克4gifs.comwow起名字白莲花她不干了少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

两个鬼故事 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化