吉林大学数据结构_图
最新数据结构习题课3讲解学习

0 50 1 10 3 -30 1 20 3 -60 35
a[0] 0 0 50 a[1] 1 0 10 a[2] 1 2 20 a[3] 3 0 -30 a[4] 3 2 -60 a[5] 3 3 5
03 10 22 31
num
00 13 23 35
pos
0
TP3[处理三元组表]
3
FOR i ← 0 TO t-1 DO
20
A[4] 3
2
-60
A[5] 3 3
5
B[4] 2
3
-60
B[5] 3 3
5
算法的关键是求出A中元素在B中的位置
Bnubmer = 0
FOR i=0 TO Cols(A) DO
FOR j=0 TO t DO
IF col(A[j])=i Then
(row(B[Bnumber])=i
col(B[Bnumber])=row(A[j])
算法: TRANSPOSE(A. B)
TP1[初始化] /*声明A的转置矩阵B,使得B的行数等于 A的列数,B的列数等于A的行数,B中非 0元素的个数等于A中非0元素的个数*/ n←Rows(B)←Cols(A). Cols (B)←Rows(A). t←Count(B)← Count(A).
TP2
row(B[k]) ←col(A[i]).
val(B[k]) ← val(A[i]).
pos[p]← pos[p]+1 ).
a[0] 0 0 50 a[1] 1 0 10 a[2] 1 2 20 a[3] 3 0 -30 a[4] 3 2 -60 a[5] 3 3 5
0 0 50 0 1 10
2 1 20
计算机专业基础综合数据结构图历年真题试卷汇编4_真题无答案

计算机专业基础综合数据结构(图)历年真题试卷汇编4(总分58, 做题时间90分钟)6. 综合题1.已知一图如下图所示:(1)写出全部拓扑排序;(2)以V1为源点,以V8为终点,给出所有事件允许发生的最早时间和最晚时间,并给出关键路径;(3)求V1结点到各点的最短距离。
【北京邮电大学2000五(15分)】SSS_TEXT_QUSTI2.(1)对于有向无环图,叙述求拓扑有序序列的步骤;(2)对于以下的图,写出它的四个不同的拓扑有序序列。
【南开大学1998二(12分)】SSS_TEXT_QUSTI3.有向图的拓扑排序能否用图的深度搜索模式来查找?若能,请简述方法;若不能,请简述原因。
【西北大学2000二、8(5分)】SSS_TEXT_QUSTI4.下图是带权的有向图G的邻接表表示法,求:(1)以结点V1出发深度遍历图G 所得的结点序列;(2)以结点V1出发广度遍历图G所得的结点序列;(3)从结点V1到结点V8的最短路径;(4)从结点V1到结点V8的关键路径。
【中国海洋大学1999四(10分)】SSS_TEXT_QUSTI5.下表给出了某工程各工序之间的优先关系和各工序所需时间。
(1)画出相应的AOE网; (2)列出各事件的最早发生时间,最迟发生时间;(3)找出关键路径并指明完成该工程所需最短时间。
【山东大学2002七(15分)】【北京交通大学1995六(15分)】SSS_TEXT_QUSTI6.请写出应填入下列叙述中( )内的正确答案。
某一工程作业的网络图如图所示,其中箭头表示作业,箭头边的数字表示完成作业所需的天数。
箭头前后的圆圈表示事件,圆圈中的数字表示事件的编号。
用事件编号的序列(例如0一2—7—9一11)表示进行作业的路径。
完成此工程的关键路径是(A),完成此工程所需的最少天数为(B)天,此工程中具有最大充裕天数的事件是(C),充裕天数是(D)。
关键路径上的事件的充裕天数是(E)。
【上海大学2002三(10分)】SSS_TEXT_QUSTI7.求出下面AOE网中的关键路径(要求给出各个顶点的最早发生时间和最迟发生时间,并画出关键路径)。
计算机专业基础综合数据结构(图)历年真题试卷汇编1

计算机专业基础综合数据结构(图)历年真题试卷汇编1(总分:60.00,做题时间:90分钟)一、单项选择题(总题数:20,分数:40.00)1.下列关于无向连通图特性的叙述中,正确的是( )。
【2009年全国试题7(2分)】I.所有顶点的度之和为偶数Ⅱ.边数大于顶点个数减1Ⅲ.至少有一个顶点的度为1(分数:2.00)A.只有I √B.只有ⅡC.I和ⅡD.I和Ⅲ解析:解析:无向图中一条边要连接两个顶点,因此顶点的度数之和必为偶数。
n个顶点的无向连通图至少需要n-1条边。
无向连通图并不要求“至少有一个顶点的度为1”。
2.若无向图G=(V,E)中含有7个顶点,要保证图G在任何情况下都是连通的,则需要的边数最少是( )。
【2010年全国试题7(2分)】(分数:2.00)A.6B.15C.16 √D.21解析:解析:要保证n个顶点的无向图G在任何情况下都是连通的,则需要先由n-1个顶点组成完全图,从第n个顶点引一条到n-1任一顶点的边,则图肯定是连通的。
本题先由6个顶点组成完全图,需要6(6-1)/2=15条边,故按题目要求“需要的边数最少”是15+1=16。
3.对下图进行拓扑排序,可以得到不同拓扑序列的个数是( )。
【2010年全国试题8(2分)(分数:2.00)A.4B.3 √C.2D.1解析:4.下列关于图的叙述中,正确的是( )。
【2011年全国试题8(2分)】I.回路是简单路径Ⅱ.存储稀疏图,用邻接矩阵比邻接表更省空间Ⅲ.若有向图中存在拓扑序列,则该图不存在回路(分数:2.00)A.仅ⅡB.仅I、ⅡC.仅Ⅲ√D.仅I、Ⅲ解析:解析:图中第1个顶点和最后一个顶点相同的路径称为回路或环。
序列中所有顶点不重复出现的路径称为简单路径,邻接矩阵的大小只和顶点个数相关,存储稀疏图,用邻接表比邻接矩阵更省空间。
拓扑序列成功的前提是有向图中不存在回路。
5.对有n个结点、e条边且使用邻接表存储的有向图进行广度优先遍历,其算法时间复杂度是( )。
ACM算法模板(吉林大学)

目录目录 (1)Graph 图论 (3)|DAG的深度优先搜索标记 (3)|无向图找桥 (3)|无向图连通度(割) (3)|最大团问题DP+DFS (3)|欧拉路径O(E) (3)|D IJKSTRA数组实现O(N^2) (3)|D IJKSTRA O(E* LOG E) (4)|B ELLMAN F ORD单源最短路O(VE) (4)|SPFA(S HORTEST P ATH F ASTER A LGORITHM) (4)|第K短路(D IJKSTRA) (5)|第K短路(A*) (5)|P RIM求MST (6)|次小生成树O(V^2) (6)|最小生成森林问题(K颗树)O(MLOGM) (6)|有向图最小树形图 (6)|M INIMAL S TEINER T REE (6)|T ARJAN强连通分量 (7)|弦图判断 (7)|弦图的PERFECT ELIMINATION点排列 (7)|稳定婚姻问题O(N^2) (7)|拓扑排序 (8)|无向图连通分支(DFS/BFS邻接阵) (8)|有向图强连通分支(DFS/BFS邻接阵)O(N^2) (8)|有向图最小点基(邻接阵)O(N^2) (9)|F LOYD求最小环 (9)|2-SAT问题 (9)Network 网络流 (11)|二分图匹配(匈牙利算法DFS实现) (11)|二分图匹配(匈牙利算法BFS实现) (11)|二分图匹配(H OPCROFT-C ARP的算法) (11)|二分图最佳匹配(KUHN MUNKRAS算法O(M*M*N))..11 |无向图最小割O(N^3) (12)|有上下界的最小(最大)流 (12)|D INIC最大流O(V^2*E) (12)|HLPP最大流O(V^3) (13)|最小费用流O(V*E* F).......................................13|最小费用流O(V^2* F). (14)|最佳边割集 (15)|最佳点割集 (15)|最小边割集 (15)|最小点割集(点连通度) (16)|最小路径覆盖O(N^3) (16)|最小点集覆盖 (16)Structure 数据结构 (17)|求某天是星期几 (17)|左偏树合并复杂度O(LOG N) (17)|树状数组 (17)|二维树状数组 (17)|T RIE树(K叉) (17)|T RIE树(左儿子又兄弟) (18)|后缀数组O(N* LOG N) (18)|后缀数组O(N) (18)|RMQ离线算法O(N*LOG N)+O(1) (19)|RMQ(R ANGE M INIMUM/M AXIMUM Q UERY)-ST算法(O(NLOGN +Q)) (19)|RMQ离线算法O(N*LOG N)+O(1)求解LCA (19)|LCA离线算法O(E)+O(1) (20)|带权值的并查集 (20)|快速排序 (20)|2台机器工作调度 (20)|比较高效的大数 (20)|普通的大数运算 (21)|最长公共递增子序列O(N^2) (22)|0-1分数规划 (22)|最长有序子序列(递增/递减/非递增/非递减) (22)|最长公共子序列 (23)|最少找硬币问题(贪心策略-深搜实现) (23)|棋盘分割 (23)|汉诺塔 (23)|STL中的PRIORITY_QUEUE (24)|堆栈 (24)|区间最大频率 (24)|取第K个元素 (25)|归并排序求逆序数 (25)|逆序数推排列数 (25)|二分查找 (25)|二分查找(大于等于V的第一个值) (25)|所有数位相加 (25)Number 数论 (26)|递推求欧拉函数PHI(I) (26)|单独求欧拉函数PHI(X) (26)|GCD最大公约数 (26)|快速GCD (26)|扩展GCD (26)|模线性方程 A * X = B (% N) (26)|模线性方程组 (26)|筛素数[1..N] (26)|高效求小范围素数[1..N] (26)|随机素数测试(伪素数原理) (26)|组合数学相关 (26)|P OLYA计数 (27)|组合数C(N, R) (27)|最大1矩阵 (27)|约瑟夫环问题(数学方法) (27)|约瑟夫环问题(数组模拟) (27)|取石子游戏1 (27)|集合划分问题 (27)|大数平方根(字符串数组表示) (28)|大数取模的二进制方法 (28)|线性方程组A[][]X[]=B[] (28)|追赶法解周期性方程 (28)|阶乘最后非零位,复杂度O(NLOGN) (29)递归方法求解排列组合问题 (30)|类循环排列 (30)|全排列 (30)|不重复排列 (30)|全组合 (31)|不重复组合 (31)|应用 (31)模式串匹配问题总结 (32)|字符串H ASH (32)|KMP匹配算法O(M+N) (32)|K ARP-R ABIN字符串匹配 (32)|基于K ARP-R ABIN的字符块匹配 (32)|函数名: STRSTR (32)|BM算法的改进的算法S UNDAY A LGORITHM (32)|最短公共祖先(两个长字符串) (33)|最短公共祖先(多个短字符串)...............................33Geometry 计算几何.. (34)|G RAHAM求凸包O(N* LOG N) (34)|判断线段相交 (34)|求多边形重心 (34)|三角形几个重要的点 (34)|平面最近点对O(N* LOG N) (34)|L IUCTIC的计算几何库 (35)|求平面上两点之间的距离 (35)|(P1-P0)*(P2-P0)的叉积 (35)|确定两条线段是否相交 (35)|判断点P是否在线段L上 (35)|判断两个点是否相等 (35)|线段相交判断函数 (35)|判断点Q是否在多边形内 (35)|计算多边形的面积 (35)|解二次方程A X^2+B X+C=0 (36)|计算直线的一般式A X+B Y+C=0 (36)|点到直线距离 (36)|直线与圆的交点,已知直线与圆相交 (36)|点是否在射线的正向 (36)|射线与圆的第一个交点 (36)|求点P1关于直线LN的对称点P2 (36)|两直线夹角(弧度) (36)ACM/ICPC竞赛之STL (37)ACM/ICPC竞赛之STL简介 (37)ACM/ICPC竞赛之STL--PAIR (37)ACM/ICPC竞赛之STL--VECTOR (37)ACM/ICPC竞赛之STL--ITERATOR简介 (38)ACM/ICPC竞赛之STL--STRING (38)ACM/ICPC竞赛之STL--STACK/QUEUE (38)ACM/ICPC竞赛之STL--MAP (40)ACM/ICPC竞赛之STL--ALGORITHM (40)STL IN ACM (41)头文件 (42)线段树 (43)求矩形并的面积(线段树+离散化+扫描线) (43)求矩形并的周长(线段树+离散化+扫描线) (44)Graph 图论/*==================================================*\| DAG的深度优先搜索标记| INIT: edge[][]邻接矩阵; pre[], post[], tag全置0;| CALL: dfstag(i, n); pre/post:开始/结束时间\*==================================================*/int edge[V][V], pre[V], post[V], tag;void dfstag(int cur, int n){ // vertex: 0 ~ n-1pre[cur] = ++tag;for (int i=0; i<n; ++i) if (edge[cur][i]) {if (0 == pre[i]) {printf("Tree Edge!\n");dfstag(i,n);} else {if (0 == post[i]) printf("Back Edge!\n");else if (pre[i] > pre[cur])printf("Down Edge!\n");else printf("Cross Edge!\n");}}post[cur] = ++tag;}/*==================================================*\| 无向图找桥| INIT: edge[][]邻接矩阵;vis[],pre[],anc[],bridge 置0;| CALL: dfs(0, -1, 1, n);\*==================================================*/int bridge, edge[V][V], anc[V], pre[V], vis[V];void dfs(int cur, int father, int dep, int n){ // vertex: 0 ~ n-1if (bridge) return;vis[cur] = 1; pre[cur] = anc[cur] = dep;for (int i=0; i<n; ++i) if (edge[cur][i]) {if (i != father && 1 == vis[i]) {if (pre[i] < anc[cur])anc[cur] = pre[i];//back edge}if (0 == vis[i]) { //tree edgedfs(i,cur,dep+1,n);if (bridge) return;if (anc[i] < anc[cur]) anc[cur] = anc[i];if (anc[i] > pre[cur]) { bridge = 1; return; } }}vis[cur] = 2;}/*==================================================*\| 无向图连通度(割)| INIT: edge[][]邻接矩阵;vis[],pre[],anc[],deg[]置为0;| CALL: dfs(0, -1, 1, n);| k=deg[0], deg[i]+1(i=1…n-1)为删除该节点后得到的连通图个数| 注意:0作为根比较特殊!\*==================================================*/int edge[V][V], anc[V], pre[V], vis[V], deg[V];void dfs(int cur, int father, int dep, int n){// vertex: 0 ~ n-1int cnt = 0;vis[cur] = 1; pre[cur] = anc[cur] = dep;for (int i=0; i<n; ++i) if (edge[cur][i]) {if (i != father && 1 == vis[i]) {if (pre[i] < anc[cur])anc[cur] = pre[i];//back edge}if (0 == vis[i]) { //tree edgedfs(i,cur,dep+1,n);++cnt; // 分支个数if (anc[i] < anc[cur]) anc[cur] = anc[i];if ((cur==0 && cnt>1) ||(cnt!=0 && anc[i]>=pre[cur]))++deg[cur];// link degree of a vertex }}vis[cur] = 2;} /*==================================================*\| 最大团问题 DP + DFS| INIT: g[][]邻接矩阵;| CALL: res = clique(n);\*==================================================*/int g[V][V], dp[V], stk[V][V], mx;int dfs(int n, int ns, int dep){if (0 == ns) {if (dep > mx) mx = dep;return 1;}int i, j, k, p, cnt;for (i = 0; i < ns; i++) {k = stk[dep][i]; cnt = 0;if (dep + n - k <= mx) return 0;if (dep + dp[k] <= mx) return 0;for (j = i + 1; j < ns; j++) {p=stk[dep][j];if (g[k][p]) stk[dep + 1][cnt++] = p;}dfs(n, cnt, dep + 1);}return 1;}int clique(int n){int i, j, ns;for (mx = 0, i = n - 1; i >= 0; i--) {// vertex: 0 ~ n-1for (ns = 0, j = i + 1; j < n; j++)if (g[i][j]) stk[1][ ns++ ] = j;dfs(n, ns, 1); dp[i] = mx;}return mx;}/*==================================================*\| 欧拉路径O(E)| INIT: adj[][]置为图的邻接表; cnt[a]为a点的邻接点个数;| CALL: elpath(0); 注意:不要有自向边\*==================================================*/int adj[V][V], idx[V][V], cnt[V], stk[V], top;int path(int v){for (int w ; cnt[v] > 0; v = w) {stk[ top++ ] = v;w = adj[v][ --cnt[v] ];adj[w][ idx[w][v] ] = adj[w][ --cnt[w] ];// 处理的是无向图—-边是双向的,删除v->w后,还要处理删除w->v}return v;}void elpath (int b, int n){ // begin from b int i, j;for (i = 0; i < n; ++i) // vertex: 0 ~ n-1 for (j = 0; j < cnt[i]; ++j)idx[i][ adj[i][j] ] = j;printf("%d", b);for (top = 0; path(b) == b && top != 0; ) {b = stk[ --top ];printf("-%d", b);}printf("\n");}/*==================================================*\| Dijkstra数组实现O(N^2)| Dijkstra --- 数组实现(在此基础上可直接改为STL的Queue实现)| lowcost[] --- beg到其他点的最近距离| path[] -- beg为根展开的树,记录父亲结点\*==================================================*/#define INF 0x03F3F3F3Fconst int N;int path[N], vis[N];void Dijkstra(int cost[][N], int lowcost[N], int n, int beg){ int i, j, min;memset(vis, 0, sizeof(vis));vis[beg] = 1;for (i=0; i<n; i++){lowcost[i] = cost[beg][i]; path[i] = beg;}lowcost[beg] = 0;path[beg] = -1; // 树根的标记int pre = beg;for (i=1; i<n; i++){min = INF;dist[v] = dist[u] + c;for (j=0; j<n; j++)// 下面的加法可能导致溢出,INF 不能取太大if (vis[j]==0 &&lowcost[pre]+cost[pre][j]<lowcost[j]){lowcost[j] =lowcost[pre] + cost[pre][j]; path[j] = pre; } for (j=0; j<n; j++) if (vis[j] == 0 && lowcost[j] < min){ min = lowcost[j]; pre = j; } vis[pre] = 1; } } /*==================================================*\ | Dijkstra O(E * log E) | INIT: 调用init(nv, ne)读入边并初始化; | CALL: dijkstra(n, src); dist[i]为src 到i 的最短距离 \*==================================================*/ #define typec int // type of cost const typec inf = 0x3f3f3f3f; // max of cost typec cost[E], dist[V]; int e, pnt[E], nxt[E], head[V], prev[V], vis[V]; struct qnode { int v; typec c; qnode (int vv = 0, typec cc = 0) : v(vv), c(cc) {} bool operator < (const qnode& r) const { return c>r.c; } }; void dijkstra(int n, const int src){ qnode mv; int i, j, k, pre; priority_queue<qnode> que; vis[src] = 1; dist[src] = 0; que.push(qnode(src, 0)); for (pre = src, i=1; i<n; i++) { for (j = head[pre]; j != -1; j = nxt[j]) { k = pnt[j]; if (vis[k] == 0 && dist[pre] + cost[j] < dist[k]){ dist[k] =dist[pre] + cost[j]; que.push(qnode(pnt[j], dist[k])); prev[k] = pre; } } while (!que.empty() && vis[que.top().v] == 1) que.pop(); if (que.empty()) break ; mv = que.top(); que.pop(); vis[pre = mv.v] = 1; } } inline void addedge(int u, int v, typec c){ pnt[e] = v; cost[e] = c; nxt[e] = head[u]; head[u] = e++; } void init(int nv, int ne){ int i, u, v; typec c; e = 0;memset(head, -1, sizeof (head));memset(vis, 0, sizeof (vis));memset(prev, -1, sizeof (prev));for (i = 0; i < nv; i++) dist[i] = inf;for (i = 0; i < ne; ++i) {scanf("%d%d%d", &u, &v, &c);// %d: type of cost addedge(u, v, c); // vertex: 0 ~ n-1, 单向边 }}/*==================================================*\| BellmanFord 单源最短路O(VE)| 能在一般情况下,包括存在负权边的情况下,解决单源最短路径问题| INIT: edge[E][3]为边表| CALL: bellman(src);有负环返回0;dist[i]为src 到i 的最短距| 可以解决差分约束系统: 需要首先构造约束图,构造不等式时>=表示求最小值, 作为最长路,<=表示求最大值, 作为最短路 (v-u <= c:a[u][v] = c )\*==================================================*/#define typec int // type of costconst typec inf=0x3f3f3f3f; // max of costint n, m, pre[V], edge[E][3];typec dist[V];int relax (int u, int v, typec c){if (dist[v] > dist[u] + c) {pre[v] = u; return 1; } return 0; } int bellman (int src){ int i, j;for (i=0; i<n; ++i) { dist[i] = inf; pre[i] = -1; } dist[src] = 0; bool flag; for (i=1; i<n; ++i){ flag = false; // 优化 for (j=0; j<m; ++j) { if( 1 == relax(edge[j][0], edge[j][1], edge[j][2]) ) flag = true; } if( !flag ) break; } for (j=0; j<m; ++j) { if (1 == relax(edge[j][0], edge[j][1], edge[j][2])) return 0; // 有负圈 } return 1; } /*==================================================*\ | SPFA(Shortest Path Faster Algorithm) Bellman-Ford 算法的一种队列实现,减少了不必要的冗余计算。
《数据结构图论部分》PPT课件

Page 4
2020/11/24
哥尼斯堡七桥问题
能否从某个地方出发,穿过所有的桥仅一次 后再回到出发点?
Page 5
2020/11/24
七桥问题的图模型
欧拉回路的判定规则:
1.如果通奇数桥的地方多于
C
两个,则不存在欧拉回路;
2.如果只有两个地方通奇数
桥,可以从这两个地方之一
A
B 出发,找到欧拉回路;
V4 是有向边,则称该图为有向图。
Page 9
2020/11/24
简单图:在图中,若不存在顶点到其自身的边,且同 一条边不重复出现。
V1
V2
V3
V4
V5
非简单图
V1
V2
V3
V4
V5
非简单图
V1
V2
V3
V4
V5
简单图
❖ 数据结构中讨论的都是简单图。
Page 10
2020/11/24
图的基本术语
邻接、依附
DeleteVex(&G, v); 初始条件:图 G 存在,v 是 G 中某个顶点。 操作结果:删除 G 中顶点 v 及其相关的弧。
Page 34
2020/11/24
InsertArc(&G, v, w); 初始条件:图 G 存在,v 和 w 是 G 中两个顶点。 操作结果:在 G 中增添弧<v,w>,若 G 是无向的,则还
Page 2
2020/11/24
• 知识点
– 图的类型定义 – 图的存储表示 – 图的深度优先搜索遍历和广度优先搜索遍历 – 无向网的最小生成树 – 拓扑排序 – 关键路径 – 最短路径
Page 3
[考研类试卷]计算机专业基础综合数据结构(图)历年真题试卷汇编9.doc
![[考研类试卷]计算机专业基础综合数据结构(图)历年真题试卷汇编9.doc](https://img.taocdn.com/s3/m/c98b4e8d5fbfc77da269b1b5.png)
[考研类试卷]计算机专业基础综合数据结构(图)历年真题试卷汇编9 一、综合题1 下面的邻接表表示一个给定的无向图。
(1)给出从顶点v1开始,对图G用深度优先搜索法进行遍历时的顶点序列;(2)给出从顶v1,1开始,对图G用广度优先搜索法进行遍历时的顶点序列。
【复旦大学1998六(10分)】1 给出图G:2 画出G的邻接表表示图;3 根据你画出的邻接表,以顶点①为根,画出G的深度优先生成树和广度优先生成树。
【南开大学1997五(14分)】【烟台大学2007四、3(15分)】4 已知一个有向图如图所示,则从顶点a出发进行深度优先遍历,写出所有可能得到的DFS序列。
【北京交通大学2006四、4(5分)】4 解答下面的问题:【西安电子科技大学2000计算机应用六(10分)】5 如果每个指针需要4字节,每个顶点的标号占2字节,每条边的权值占2字节。
下图采用哪种表示法所需的空间较多?为什么?6 写出下图从顶点1开始的:DFS树。
7 如下所示的连通图,请画出:(1)以顶点①为根的深度优先生成树;(5分)(2)如果有关节顶点,请找出所有的关节顶点。
(5分)【清华大学l 998七(10分)】7 某田径赛中各选手的参赛项目表如下:设项目A,B,…,F各表示一数据元素,若两项目不能同时举行,则将其连线(约束条件)。
8 根据此表及约束条件画出相应的图状结构模型,并画出此图的邻接表结构;9 写出从元素A出发按“广度优先搜索”算法遍历此图的元素序列。
【北京科技大学1999五2000五(12分)】10 考虑下图:(1)从顶点A出发,求它的深度优先生成树。
(2)从顶点E出发,求它的广度优先生成树。
(3)根据普利姆(Prim)算法,求它的最小生成树。
【上海交通大学1999六(12分)】11 在什么情况下,Prim算法与Kruskual算法生成不同的MST?【西安电子科技大学2000计算机应用一、11(5分)】12 已知一个无向图如下图所示,要求分别用Prim和Kruskal算法生成最小生成树(假设以①为起点,试画出构造过程)。
吉林大学数据结构_堆栈、队列

链式栈——入栈算法
算法Push(item)
/*向栈顶指针为top的链式栈中压入一个元素item*/
P1. [创建新结点]
s<=AVAIL. data(s) ←item. next(s) ←top.
P2. [更新栈顶指针]
top ←s. ▍
链式栈——出栈算法
算法Pop(.item)
/*从栈顶指针为top的链式栈中弹出栈顶元素,并存放在变量 item中*/
链式队列——存取队首元素
算法QFront(.item) /*读取队首元素值并将其存入item*/ QD1.[队列空?] if front=null then (print “队空”. Return.) QD2.[存取] item ← data(front). ▍
P1. [栈空?]
IF top=NULL THEN (PRINT “栈空无法弹出”. RETRUN.)
P2. [出栈]
item ←data(top). q ←next(top). AVAIL<=top. top ←q. ▍
链式栈——存取栈顶元素
算法Peek(.item) /*将栈顶指针为top的链式栈的栈顶元素存放 在变量item中*/ P1. [栈空?] IF top=NULL THEN (PRINT “栈空”. RETRUN.) P2. [存取栈顶] item ←data(top). ▍
链式栈——栈清空
算法Clear() /*将栈顶指针为top的链式栈清空*/ C1. [逐一出栈,直至栈空] WHILE top≠NULL DO ( q ←next(top). AVAIL<=top. top ←q. )▍
顺序栈与链式栈的比较-1
• 空间复杂性:
吉林大学数据结构_第二章 线性表

如何找指定位置的结点?
• 与顺序表不同,单链表无法直接访问指定 位置的结点,而是需要从哨位结点开始, 沿着next指针逐个结点计数,直至到达指定 位置。
操作
• • • • 存取 查找 删除 插入
存取算法
算法Find(k.item) /*将链表中第k个结点的字段值赋给item*/ F1. [k合法?] IF (k<1) THEN (PRINT “存取位置不合法”. RETURN.) F2. [初始化] p←head. i ←0. F3. [找第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) item←data(p). ▍ 存取算法的时间复杂性分析。P30
插入算法
算法Insert(k,item) /*在链表中第k个结点后插入字段值为item的结点*/ I1.[k合法?] IF (k<0) THEN (PRINT “插入不合法”. RETURN) I2.[初始化] p←head. i ←0. I3.[p指向第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “插入不合法”. RETURN. ) I4.[插入] s<= AVAIL. data(s) ←item. next(s) ←next(p). next(p) ←s. ▍
删除算法
算法Delete(k.item) /*删除链表中第k个结点并将其字段值赋给item*/ D1.[k合法?] IF (k<1) THEN (PRINT “删除不合法”. RETURN.) D2.[初始化] p←head. i ←0. D3.[找第k-1结点] WHILE (p ≠NULL AND i<k-1) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) D4.[删除] q ← next(p). next(p) ← next(q) . item←data(q). AVAIL<=q.▍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 定义5.5 设G是无向图, v ∈ V(G),E(G)中 以v为端点的边的个数称为顶点v的度。若G 是有向图,则v的出度是以v为始点的边的个 数,v的入度是以v为终点的边的个数。
• 定义5.7 设G,H是图,如果V(H) V(G), E(H) E(G),则称H是G的子图,G是H的母 图。
• 如果H是G的子图,并且V(H) = V(G),则称H 为G的支撑子图。
• 定义5.3 在无向图G中,若两个顶点w和v之 间存在一条边(w,v) ,则称w,v是相邻的,二 者互为邻接顶点。在有向图G中,若存在一 条边<w,v> ,则称顶点w邻接到顶点v ,顶 点v邻接自顶点w 。 • 定义5.4 由于E是边的集合,故一个图中不 会多次出现一条边。若去掉此限制,则由 此产生的结构称为多重图。
图
• 定义5.1 图G由两个集合V和E组成,记为G = (V, E),其中V是顶点的有限集合,E是连接 V中两个不同顶点(顶点对)的边的有限集 合。如果E中的顶点对是有序的,即E中的 每条边都是有方向的,则称G为有向图。如 果顶点对是无序对,则称G是无向图。一般 情况下,图G的边集合记为E(G),顶点集合 记为 V(G) .
• 定义5.2 若G = (V, E)是有向图,则它的一条 有向边是由V中两个顶点构成的有序对,亦 称为弧,记为<w,v> ,其中 w是边的始点, 又称弧尾;v 是边的终点,又称弧头。 • 若G为无向图,则图中的边记作(w,v) 。因为 (w,v)是无序对,所以(w,v)和(v,w)代表同