4003基于邻接表的新顶点的增加(C++,附详细解析)
描述
给定一个无向图,在此无向图中增加一个新顶点。
输入
多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有一个数字f,代表新插入的顶点编号。当n和m都等于0时,输入结束
输出
每组数据输出n+1行。为增加顶点后的邻接表。每两个数字之间用空格隔开。
输入样例 1
3 2
1 2
2 3
4
2 1
1 2
4
0 0
输出样例 1
1 2 2 3 1 3 2 4 1 2 2 1 4
这是邻接表的第一道题,从这道题练起,慢慢熟悉邻接表的使用机制吧(ง • v •)ง~
思路:
邻接表就是所有的表头(顶点)在一个大的数组里顺序排列,表里的每一个元素都是一个链表节点,它们又各自分别指向与自己相邻的节点,就像是一栋大楼,从上到下每一层的窗户里都伸出不同的花枝来一样~是不是很形象呢~
看ppt上的示例代码感觉那个数组开得太大了,实际生活中不方便,所以想改良一下能不能结合题意弄一个长度可变,或者是不一下开这么大的数组,然后想到了线性表那一章里面用一个int*指针,在创建顺序表的时候才new一个已知大小的数组的思路,于是决定采用那个思路。
重点:区分好普通节点LNode和指向节点的指针linklist
由题意,邻接表从1开始算,所以要能使用下标为n的区域,并且后来又插了一个新节点,所以一共要开辟[n+2]这么大的数组,因为VList是linklist类型(指针类型),所以它的new是new一个LNode类型(可以简记为new是比当前“低”一个等级的)
之后遍历那个数组,初始化每个点的序号以及指向NULL。
h,k那里,linklist p,q之后,别忘了要=new LNode就是头插法了,不然那么多节点都要弄尾节点还要取好名字不可能的。。
之后在n+1位输入新插入的节点,它是孤立点,所以指向NULL就可以了
Show的时候也用指针的方式,对“大楼”里的每层都建立一个指针,然后遍历输出就可以了,注意输出格式,另外由于是用p->next作为判断条件,别忘了手动输出最后一个节点的vex~
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef struct LNode
{int vex;struct LNode* next;
}*linklist, LNode;
typedef struct Sheet
{LNode *VList;int vexnum;int arcnum;
}ALGragh;
void Create(ALGragh& alg, int n, int m)
{alg.vexnum = n;alg.arcnum = m;alg.VList = new LNode[n+2];for (int i = 1; i <= n; i++){alg.VList[i].vex = i;alg.VList[i].next = NULL;}int h, k;for (int i = 0; i < m; i++){cin >> h >> k;linklist p=new LNode, q=new LNode;p->vex = h;p->next = alg.VList[k].next;q->vex = k;q->next = alg.VList[h].next;alg.VList[h].next = q;alg.VList[k].next = p;}int p;cin >> p;alg.VList[n + 1].vex = p;alg.VList[n + 1].next = NULL;
}
void Show(ALGragh alg,int n)
{for (int i = 1; i <= n + 1; i++){linklist p = &alg.VList[i];while (p->next){cout << p->vex;if (p->next)cout << ' ';p = p->next;}cout <<p->vex<< endl;}
}
int main()
{int m, n;while (cin >> n >> m && m != 0 && n != 0){ALGragh a;Create(a, n, m);Show(a, n);}return 0;
}
4003基于邻接表的新顶点的增加(C++,附详细解析)相关推荐
- 4007-基于邻接表的新边的增加(C++,附思路)
描述 给定一个无向图,在此无向图中增加一条边. 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k,代表边依附的两个 ...
- 4005基于邻接表的顶点的删除(C++,附思路)
描述 给定一个无向图,在此无向图中删除一个顶点. 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k,代表边依附的两 ...
- 4014基于邻接表的长度为k的简单路径的求解
描述 一个连通图采用邻接表作为存储结构.设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径. 输入 多组数据,每组m+3数据行.第一行有两个数字n,m和k,代表有n个顶点,m条边和 ...
- C++笔记-基于邻接表的BFS(宽度优先遍历)
这里是基于邻接表的,有向的,具体代码如下: #include <iostream> #include <list>using namespace std;class Graph ...
- SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...
- 【 第11关:基于邻接表的深度优先遍历】【编程题实训-图】【头歌】【bjfu-282】
任务描述 一个连通图采用邻接表作为存储结构.设计一个算法,实现从顶点v出发的深度优先遍历的非递归过程. 编程要求 输入 多组数据,每组m+2数据行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点 ...
- 《新武林传奇》大侠能力详细解析
为什么80%的码农都做不了架构师?>>> 在国内首款武侠消除游戏<新武林传奇>中,想要成功闯荡江湖称霸武林,自然不能缺少极品大侠的协助.那么如何才能判断一位大侠是否 ...
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< ...
- 4004-基于邻接矩阵的新顶点的增加(C++,附思路)
描述 给定一个无向图,在此无向图中增加一个新顶点. 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k,代表边依附的 ...
最新文章
- Docker容器管理总结
- 《算法入门经典大赛——培训指南》第二章考试
- hdu4561 bjfu1270 最大子段积
- Java设计模式学习总结(12)——结构型模式之外观模式
- 【人工智能沙龙】未来,语音识别可能应用于哪些商业化场景?
- Rabbit MQ 安装
- 网页设计css入门,网页设计基础:Div+CSS布局入门教程
- 怎么样建立局域网?一般局域网需要几台电脑才可以?
- 红蓝眼睛(答案在文章中找)
- SolidWorks 部分插件不显示
- SSMS安装失败及解决
- 用正则表达式提取歌词LRC中的歌词
- 阿里云网站备案注销新规则
- 算法学习笔记之滑动平均滤波算法
- 通过调用Exiftool可以提取文件名的信息, 设置媒体文件的TagInfo相关信息
- 高性能网站建设指南-前端性能优化(一)
- oracle19c只使用pdb模式,oracle 19c CDB vs pdb 创建
- 616微盟零售购物节开办:全链路智慧增长开拓B端思维边界
- 基于MATLAB的Alexnet迁移学习进行猫狗分类(数据集:Kaggle)
- 半年多过去了,还记得影响力是怎么炼成的?
热门文章
- 多线程十 Timer
- easyui input输入框的限制和校验条件
- 再谈布局,栅栏式自适应布局的学习和实现(calc自适应布局)
- Codeforces Round #346 (Div. 2) D. Bicycle Race 叉积
- java窗体与Flash交互
- [转]SUID和SGID
- Android音乐播放器高级开发
- java基础——“”equals“”与 “”==“” 的区别
- Mr.J-- jQuery学习笔记(八)--CSS样式操作
- 递归:我不用栈 非递归:栈使我快乐