DS博客做业06--图

1.本周学习总结

1.1思惟导图

1.2谈谈你对图结构的认识及学习体会

到了图结构,数据结构更加体现出来它在生活中的实际应用,包括最小路径寻找以及最小生成树,所以他也显得很重要,不只仅是在未来的工做或者工做面试,亦或者是acm的比赛中都须要大范围的使用。其实在学习图结构以前,我彻底不知道该怎么存储一个图结构,树还能想象,后来发现图的存储其实很简单粗暴,可是也十分实用,对于不一样的算法也都有不一样的存储结构,能够说是很神奇了。然而这一章节的学习也须要花时间去理解,复习。算法

2.PTA实验做业

2.1.题目1:7-4 公路村村通

题目描述数组

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每一个村落都有公路连通所须要的最低成本。
输入格式
输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。
输出格式
输出村村通须要的最低成本。若是输入数据不足以保证畅通,则输出−1,表示须要建设更多公路。微信

2.1.1设计思路

自从上次梅梅在我面前秀过一手优先队列我就对这个容器爱不释手,配合优先队列,我决定采用克鲁斯卡尔算法再加以并查集的辅佐来完成这一个题目
在这以前要解决几个问题:
1.首先是优先队列中的比较问题,对于一个int型或者double型的变量进行操做固然容易,可对于一个结构体,如何传入一个已有的函数让他进行比较呢。这里就须要在结构体中对比较符号进行重载,使得咱们能直接对结构体进行比较。
2.其次是优先队列中的排序问题,优先队列时默认从从大到小排列的,可是咱们这里最小生成树须要的是从小到大,因此咱们就须要在定义优先队列的时候采用小顶堆进行排序。网络

priority_queue<Road, vector<Road>, greater<Road>> all //首先定义一个all优先队列
int count //计算已经存储的道路
int cost //记录消费
for i=1 to road:
    将已有的道路信息传入队列;
for i=0 to town:
    初始化并查集
while all.size():
    temp=all.front()
    all出队
    if(temp.town1和temp.town2不连通):
        Union(town1,town2)合并两个村;
        cost更新;
        count++;
输出cost

2.1.2代码截图

2.1.3本题PTA提交列表说明

WA:这两个错误的缘由其实都同样,就是当不连通的时候没有办法判断,之因此第一个错误多了两分是由于我加了个if语句判断M<N-1的状况,后来我发现只要统计一下在操做过程当中链接上的道路数目是否是等于城镇数减一就行了。数据结构

2.2.题目2:7-7 旅游规划

题目描述函数

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。如今须要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。若是有若干条路径都是最短的,那么须要输出最便宜的一条路径。
输入格式
输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市一、城市二、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。
输出格式
在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。工具

2.2.1设计思路

思路一:这题我是用弗洛伊德算法去作的,心想日常的课后做业应该不会很难,因此时间复杂度高一点应该没问题,本来的使用一个int矩阵去实现的,可是这里多了一个价格的选项,因此咱们设计一个结构体来存储这些数据学习

typedef struct road {
    int dist;//距离
    int cost;//消费
}Road;

伪代码以下:大数据

Road matrix[MAX]
cin >> n >> m >> s >> d;
初始化矩阵全部元素为INF
while m--:
    读取路径信息到矩阵
弗洛伊德算法
for k=0 to n-1:
    for i=0 to n-1:
        for j=0 to n-1:
            if matrix[i][j].dist > matrix[i][k]+matrix[k][j].dist:    //原路径比新路径长
                更新matrix[i][j]的cost和dist

            else if 原路径等于新路径:
                if 原路径消费 > 新路径:
                    更新matrix[i][j]的cost和dist

            else 保持不变

cout << matrix[s][d].dist << ' ' << matrix[s][d].cost;

思路二:Dijskstra算法
对于这个算法来说,只要在课本上算法的基础上增长一个cost数组数组用来记录消费就能够了,而后最后进行修正的时候若是找到路程相等的就直接比较他们的消费就醒行了

2.2.2代码截图

思路一:

思路二:

2.2.3本题PTA提交列表说明

WA:这里错误是由于我忽略了他是一个无向图,一开始当成有向图作了,只要在初始化路径信息时添加上面两条语句就好啦。

2.3.题目3:7-3 六度空间

题目描述

“六度空间”理论又称做“六度分隔(Six Degrees of Separation)”理论。这个理论能够通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多经过五我的你就可以认识任何一个陌生人。”如图1所示。

“六度空间”理论虽然获得普遍的认同,而且正在获得愈来愈多的应用。可是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而因为历史的缘由,这样的研究具备太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通讯等工具,可以体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。假如给你一个社交网络图,请你对每一个节点计算符合“六度空间”理论的结点占结点总数的百分比。
输入格式
输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤10​4​​,表示人数)、边数M(≤33×N,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。
输出格式
对每一个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每一个结节点输出一行,格式为“结点编号:(空格)百分比%”。

2.3.1设计思路

这道题目我想采用vector来作,vector至关于一个可增长的数组,这样一来也就至关于在用邻接表了
至于认识的人,我用set容器来存储,由于set不会存储重复数据,但其实直接用count来统计人数也行,我一开始是想六个层次无脑塞进set容器,这样直接取size就能够了,可是后来发现这样会致使大数据内存爆掉
遍历方式采用广度遍历,符合题意

main函数:

cin >> n >> e;
set<int> check;
vector<int> point[MAX];
while e--:
    循环读取人脉信息到point里面
for i=1 to n:
    初始化vis为0
    BFS(i, 0)
    清空check

BFS函数:int i,int c;

queue<int> q;
q.push(i)
check.insert(i)
for i=1 to 6:
    vector<int> store;
    转移q中的数据到store
    for i=0 to store.size()-1:
        int temp=store[i]
        将temp的下一个节点所有入队q

2.3.2代码截图

2.3.3本题PTA提交列表说明

WA:这道题目是缠了我比较久的,我用vector去作,可是无论怎么样最后一个点老是内存超限,我真的超级纳闷,照理说这个vector应该相似于邻接表了,怎么还会内存超限,我一开始代码是这样的

后来思索了很久

我将每一层的子元素入队时没有判断是否曾经访问过,直接所有入队,难道时由于这个爆了???遂增长vis数组判断是否访问过
而后就过了

3.上机考试错题及处理办法

3.1.截图错题代码

这几题都没作出来,就不贴错题代码了。。。我后面把这些题目又重作了一遍
题目1:最短路径
修改后的代码

题目2:公路村村通
这道题目并不须要记录上一个点的位置,就不用像书本同样多一个数组了
修改后的代码

3.2 错的缘由及处理方法

这词上机考试,原想剑走偏锋,不曾想被当场制裁,究其缘由,就是没有好好去练习图结构,对图结构的一些算法也了解不是很清楚,仍是应该好好反思一下本身。

相关文章
相关标签/搜索