数据结构期末复习Ⅵ——图

先放几个💣(╯‵□′)╯炸弹!•••*~●
炸醒一些不知道事态严重性的糊涂蛋~
在这里插入图片描述
鉴于之前老杜还透露了题目多,题量大,所以我们要做好做不完的准备(范围肯定不止作业)尽可能地多得分。所以是真的没有选填了,来不及伤心了,哈雅酷。还有一个坏消息就是这章我没有跟着课程写伪码。。所以我会把书后练习题的答案用代码块贴出来【不是标程,自己写的,因为貌似没有答案😭】。

其实最头疼的是书上的一些英文名词,它专业的模样让你实在不忍心擅自篡改,所以,下面的内容,务必记住~
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

邻接矩阵AMGraph

顶点表:vexs(用于插入边时LocateVex)
边表:arcs
在这里插入图片描述

邻接表ALGraph

顶点表:AdjList
该边所指向的结点:ArcNode
出发的结点:VNode
在这里插入图片描述

算法设计

在这里插入图片描述
①增加新顶点
邻接矩阵:

Status InsertVex(AMGraph &G, int v){
    if(G.vexnum + 1 > MAX) return OVERFLOW;
    G.vexs[G.vexnum++] = v;
    return OK;
}

邻接表:

Status InsertVex(ALGraph &G, int v){
    if(G.vexnum + 1 > MAX) return OVERFLOW;
    G.vertices[G.vexnum++] = v;
    return OK;
}

②删除顶点v以及相关的边
邻接矩阵:

Status DeleteVex(AMGraph &G, int v){
    n = G.vexnum - 1;
    if((m = LocateVex(G,v)) < 0) return ERROR;
    G.vexs[m] = G.vexs[n];
    for(i = 0; i < G.vexnum; i++){
        G.arcs[m][i] = G.arcs[n][i];//把最后一行填到要删除的这行
        G.arcs[n][i] = 0;//置零
    }
    G.arcnum--;//少一条边
    return OK;
}

邻接表:

Status DeleteVex(ALGraph &G, int v){
    n = G.vexnum - 1;
    if((m = LocateVex(G,v)) < 0) return ERROR;
    G.vertices[m].data = G.vertices[n].data;
    p1 = vertices[m].firstarc, p2 = vertices[n].firstarc;
    while(p1 && p2){
    	p2 = p1;
    	p1 = p1 -> nextarc;
    	p2 = p2 -> nextarc;
    }
    while(p1) p1 -> nextarc = NULL;
    while(p2) p1 -> nextarc = p2;
    G.arcnum--;//少一条边
    return OK;
}

③增加一条边<v,w>
邻接矩阵:

Status InsertArc(AMGraph &G, int v, int w){
    if((i = LocateVex(G,v)) < 0) return ERROR;
    if((j = LocateVex(G,w)) < 0) return ERROR;
    if(i == j) return ERROR;
    if(!G.arcs[i][j]) {
        G.arcs[i][j] = 1;
        G.arcnum++;
    }
    return OK;
}

邻接表:

Status InsertArc(ALGraph &G, int v, int w){
    if((i = LocateVex(G,v)) < 0) return ERROR;
    if((j = LocateVex(G,w)) < 0) return ERROR;
    if(i == j) return ERROR;
    p = G.vercites[i].firstarc;
    while(p -> nextarc){
    	if(p -> adjvex == j) return OK;//已经存在
   		p = p -> nextarc;
    }
    q = new ArcNode;
    q -> adjvex = j;
    q -> nextarc = NULL;
    p -> nextarc = q;
    G.arcnum++;
    return OK;
}

④删除一条边<v,w>
邻接矩阵:

Status DeleteArc(AMGraph &G, int v, int w){
    if((i = LocateVex(G,v)) < 0) return ERROR;
    if((j = LocateVex(G,w)) < 0) return ERROR;
    if(i == j) return ERROR;
    if(G.arcs[i][j]){
        G.arcs[i][j] = 0;
        G.arcnum--;
    }
    return OK;
}

邻接表:

Status DeleteArc(ALGraph &G, int v, int w){
    if((i = LocateVex(G,v)) < 0) return ERROR;
    if((j = LocateVex(G,w)) < 0) return ERROR;
    if(i == j) return ERROR;
    if(G.vercites[i].firstarc -> adjvex == j){
    	G.vercites[i].firstarc -> adjvex = NULL;
    	G.arcnum--;
    	return OK;
    }
    q = G.vercites[i].firstarc;
    p = q -> nextarc;
    while(p){
    	if(p -> adjvex == j) {
    		q -> nextarc = p -> nextarc;
    		G.arcnum--;
    		return OK;
    	}
   		p = p -> nextarc;
    }
    if(!p) return ERROR;//不存在
}

在这里插入图片描述
深搜非递归只有借用栈了。不是借钱啊,是栈!

void DFS(Graph G, int v){
    Stack s;
    SetEmpty(s);
    Push(s, v);
    while(!StackEmpty(s)){
        Pop(s,k);
        if(!visited[k]){
            cout<<k;
            for(w = FirstAdjVex(G,k); w >= 0; w = NextAdjVex(G,k,w)){
                if(!visited[w] && w != GetTop(s)) //如果w和top元素相同说明有环
                Push(s, w);
            }
        }
    }
}

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

手写迪杰斯特拉算法???这么变态?抱歉,我只会看,只会算,就是不会写代码,不写了,谁爱写谁写去。

第四题太简单了,前面写过了。

在这里插入图片描述

Status simple_path(ALGraph G, int i, int j, int k){
    if(i == j && k == 0) return OK;
    if(k > 0){
        visited[i] = true;
        for(p = G.vertices[i].firstarc; p; p = p -> nextarc){
            q = p -> adjvex;
            if(!visited[q]){
                if(simple_path(G,q,j,k-1)) return OK;
            }
            visited[i] = false;
        }
    }
    return ERROR;
}

心情突然烦躁起来了,根本不知道考试难度如何啊!这怎么玩,对手未知。今年还和往年的题目不一样!也是醉了。反正手写迪杰斯特拉我是不会的,也不想学,也懒得学,没必要。O(n^3)也太过时了,为什么不学更优秀的算法呢?

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值