博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
博客作业06--图
阅读量:6224 次
发布时间:2019-06-21

本文共 6336 字,大约阅读时间需要 21 分钟。

1.学习总结(2分)

1.1图的思维导图

1233791-20180617192002275-1307988003.png

1.2 图结构学习体会

图的遍历

  • 图的深度优先遍历是从初始点v出发,以纵向的方式逐渐访问各个顶点,一旦找不到相邻的顶点就回退,需要递归的过程,广度遍历是类似层次遍历,利用队列来一一访问

Prim和Kruscal算法

  • Prim和Kruscal算法,Prim算法是多次寻找邻边的权重最小值,而Kruskal是需要先对权重排序后查找的,Kruskal在算法效率上是比Prim快的,因为Kruskal只需一次对权重的排序就能找到最小生成树,而Prim算法需要多次对邻边排序才能找到

Dijkstra算法

  • Dijkstra算法,在无向图 G=(V,E) 中,假设每条边 E 的长度为 w,找到由顶点 V0 到其余各点的最短路径
  • 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止

拓扑排序

  • 拓扑排序:是将一个有向无环图G的所有的顶点排成一个线性序列,使得有向图中的任意的顶点u 和 v 构成的弧,(u, v) 属于该图的边集,并且使得 u 始终是出现在 v 前面
  • 只有有向无环图才可以进行拓扑排序
  • 算法思想:1.找到有向无环图中没有前驱的节点(或者说是入度为0的节点)输入;2.然后从图中将此节点删除并且删除以该节点为尾的弧

2.PTA实验作业(4分)

2.1 题目1:7-1 图着色问题

2.2 设计思路(伪代码或流程图)

输入顶点数与边数,颜色数进行建图     深度遍历并将其结果储存于数组d中     输入待检查的颜色分配方案的个数num    for( ;num;num--){            for j=1 to 顶点数{             输入颜色的分配方案,统计所用颜色总数sum              }         若统计的颜色总数sum!=题干的颜色数                   则把flag由0赋为1      }         将颜色按深度遍历排序储存在数组c中          for i=0 to 顶点数{                for j=0 to 顶点数{                  若有相邻的颜色相同                      则把flag的值由0赋为1               }             flag值已为1即已有相邻颜色相同停止循环      }   如果flag=1 输出no 否则 输出yes

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

1233791-20180618132654686-922711095.png

2.4 PTA提交列表说明。

1233791-20180618130954363-841592766.png

答案错误

部分正确

1233791-20180618140827599-1995343272.png

1233791-20180618140106779-1399819550.png

1233791-20180618140440499-709527336.png
1233791-20180618141531864-877599868.png
1233791-20180618141903701-1594915799.png

一开始数值赋不进去,只能输出两个,后发现自己在sum这里判断颜色数目时错误直接返回,出错了

改正后输出正常但是输出不对,比样例输出有一个no

自己的循环变量不对,在num循环那里自己忘记循环内有用i,重复使用变量i;

1233791-20180618141935528-740810167.png

自己的循环条件出错。。。

2.1 题目2:7-3 六度空间

2.2 设计思路(伪代码或流程图)

int bfs(int v)  {      初始化队列    while(队不空)      {         出队元素v        for  i=1 to 顶点数        {              若G[v][i]==1 && vis[i]==0            {                  count++;                 把i进队                tail=i;              }          }         若v为该层最后一个结点        {              层数++            更新层末的顶点        }         若层数为6            跳出循环    }      返回count的值}

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

1233791-20180618205551223-2065728740.png

2.4 PTA提交列表说明。

1233791-20180618130216568-1689128820.png

1233791-20180618130239408-1184749806.png
段错误

自己最早用构建邻接矩阵的方式进行赋值,但是赋不进去,总是强制退出,后改为定义二维数组赋值才能很好运行,才正确

2.1 题目3:7-4 公路村村通

2.2 设计思路(伪代码或流程图)

int Prim(int G[MAXV][MAXV],int v)//prim算法计算最短路径 {   定义数组 lowcost[MAXV],closest[MAXV];   lowcost[1]=0;   closest[1]=0;   for i=2 to 顶点数 {    lowcost[i]=G[v][i];    closest[i]=v;  }    for i=2 to 顶点数 {    min置为INFINITY    for j=2 to 顶点数 {        在(V-U)中找出离U最近的顶点k                k记录最近顶点的编号    }      以last更新记录权值长度      lowcost[k]=0;      for j=2 to 顶点数{        若 顶点未被访图联通{            更新                   k记录最近顶点          }      }   }   返回last的值}

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

1233791-20180617212523820-927117606.png

2.4 PTA提交列表说明。

1233791-20180617212619584-90277541.png

1233791-20180617212643291-1511104767.png
部分正确

自己一开始只有-1的那个点正确

1233791-20180618215805030-648731100.png

1233791-20180618215831896-1314712273.png

后发现自己的prim算法有问题,是自己的last忘记赋初值

1233791-20180618215937627-940556500.png

1233791-20180618220110570-442544330.png

后面的部分正确是自己循环问题,在循环时少了等于,最后一层循环

编译错误

自己的选择c与c++的选择错误

3.截图本周题目集的PTA最后排名(3分)

本次题目集总分:310分

3.1 PTA排名1233791-20180622101245252-1338958499.png

3.2 我的总分:222

本题评分规则:

(1)PTA总分310分:3分(全部题目都做)

(2)PTA总分在250分--310分:2.5分(大部分做完1)
(3)PTA总分在200--250分:2分(大部分做完2)
(4)PTA总分在150--200分:1.5分
(5)PTA总分在60分-150分:1分
(6)PTA总分在60分以下:0分

4. 阅读代码(必做,1分)

#include
using namespace std; #include
#include
#include
#define inf 0x3f3f3f3f struct spe { int next,to,from; int len,time; }; spe edge[250001]; int head[501]; int cnt = 1; int n,m; bool cmp( vector
a,vector
b ) { if( a.size() != b.size() ) return false; for( int i= 0 ; i < a.size() ; i++ ) if( a[i] !=b[i] ) return false; return true; } void add(int a,int b,int len,int time) { edge[cnt].from = a; edge[cnt].to = b; edge[cnt].len = len; edge[cnt].time = time; edge[cnt].next = head[a]; head[a] = cnt; cnt++; } struct node_num { int prev,num; }; node_num node[501]; struct node_time { int prev,len; }; node_time nod[501]; int spfa_time( int start, int end ) { queue
q; int visit[501]; int dis[501]; memset(visit,0,sizeof(visit)); memset(dis,0,sizeof(dis)); memset(nod,0,sizeof(nod)); for( int i = 0 ; i < n ; i++ ) nod[i].len = inf; nod[0].prev = inf; nod[start].prev = start; nod[start].len = 0; for( int i = 0 ; i < n ; i++ ) dis[i] = inf; q.push(start); dis[start] = 0; visit[start] = 1; while( !q.empty() ) { int t = q.front(); q.pop(); for( int i = head[t] ; i != -1 ; i = edge[i].next ) { if( dis[t] + edge[i].time < dis[ edge[i].to ] ) { dis[ edge[i].to ] = dis[t] + edge[i].time; nod[ edge[i].to ].prev = t; nod[ edge[i].to ].len = nod[t].len+edge[i].len; if( visit[edge[i].to] == 0 ) { visit[edge[i].to] = 1; q.push(edge[i].to); } } else if( dis[t] + edge[i].time == dis[ edge[i].to ] ) { if( nod[t].len + edge[i].len < nod[ edge[i].to ].len ) { nod[ edge[i].to ].len = nod[t].len + nod[ edge[i].to ].len; nod[ edge[i].to ].prev = t; } } } } return dis[end]; } int spfa_len( int start, int end ) { queue
q; int visit[501]; int dis[501]; memset(visit,0,sizeof(visit)); memset(dis,0,sizeof(dis)); memset(node,0,sizeof(node)); for( int i = 0 ; i < n ; i++ ) node[i].num = inf; node[0].prev = inf; node[start].prev = start; node[start].num = 0; for( int i = 0 ; i < n ; i++ ) dis[i] = inf; q.push(start); dis[start] = 0; visit[start] = 1; while( !q.empty() ) { int t = q.front(); q.pop(); for( int i = head[t] ; i != -1 ; i = edge[i].next ) { if( dis[t] + edge[i].len < dis[ edge[i].to ] ) { dis[ edge[i].to ] = dis[t] + edge[i].len; node[ edge[i].to ].prev = t; node[ edge[i].to ].num = node[t].num+1; if( visit[edge[i].to] == 0 ) { visit[edge[i].to] = 1; q.push(edge[i].to); } } else if( dis[t] + edge[i].len == dis[ edge[i].to ] ) { if( node[t].num + 1 < node[ edge[i].to ].num ) { node[ edge[i].to ].num = node[t].num + 1; node[ edge[i].to ].prev = t; } } } } return dis[end]; // cout<<"LEN:"<
<
len,time; int t = end; while( node[t].prev != t ) { len.push_back(t); t = node[t].prev; } len.push_back(start); //prev数组顺序是反的 t = end; while( nod[t].prev != t ) { time.push_back(t); t = nod[t].prev; } time.push_back(start); if( cmp(len,time) ) { printf("Time = %d; Distance = %d:",TIME,LEN); for( int i = time.size() - 1 ; i >= 0 ; i-- ) { if( i ) printf(" %d =>",time[i]); else printf(" %d\n",time[i]); } } else { printf("Time = %d:",TIME); for( int i = time.size() - 1 ; i >= 0 ; i-- ) { if( i ) printf(" %d =>",time[i]); else printf(" %d\n",time[i]); } printf("Distance = %d:",LEN); for( int i = len.size() - 1 ; i >= 0 ; i-- ) { if( i ) printf(" %d =>",len[i]); else printf(" %d\n",len[i]); } } } return 0; }

这是天梯地图的代码

代码链接:

该代码用spfa算法:

该代码加入一个pre数组,某一点的时间和之前的时间相同,我们就判断他们的距离是否可以更新,在更新dis数组的同时更新pre数组

spfa的算法思想(动态逼近法):设立一个先进先出的队列q用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点###v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。

转载于:https://www.cnblogs.com/linxiaolu/p/9193502.html

你可能感兴趣的文章
【转】这个“哭喊着要进步”的电子工程师一路怎么走过来的~
查看>>
使用Lambda实现递归
查看>>
opengl overlay plane
查看>>
静态库和动态库
查看>>
近来有不少博友向本人提向,鉴于本站的邮件系统不是很好用,建议大家加入本人的QQ群...
查看>>
[转] SQL Server 批量 停用/启用 外键约束
查看>>
Bug管理工具
查看>>
Django performance
查看>>
touch — 设定文件的访问和修改时间
查看>>
Spark集群模式&Spark程序提交
查看>>
package-info.java(转载)
查看>>
Hash
查看>>
QuickFlow之动态子流程
查看>>
通常每个套接字地址 (协议/网络地址/端口) 只允许使用一次
查看>>
javascript使回车键替代tab键的光标移动功能
查看>>
对XML的收集2
查看>>
C#3.0学习笔记(10)泛型
查看>>
C语言头文件的使用
查看>>
MVC中,查询以异步呈现,分页不用异步的解决方案
查看>>
QTP中实现对文本文件(txt)的读写操作
查看>>