1.本周学习总结
1.1思维导图
1.2.对图的认识及学习体会
图结构相对于树来说,比较好理解,邻接矩阵可以用二维数组来做,邻接表结构是好理解,就是结构体的定义以及代码编写过程较复杂。图这一章感觉难点在于最小生成树和最短路径的这几个算法,虽然图的结构容易定义,但是运用来解决问题,并结合算法,就想不出来了。还是对于解题思路这方面有着很大的难度。
2.PTA实验作业
2.1.题目1: 7-7 旅游规划
2.1.1设计思路
void dijkstra(int s) //修改后的最短路算法,+path 记录 和 花费计算
{
int i,j;
初始化标记数组vis
for(i=0 to n)//初始化数组dis,cost的值
{
dis[i]=mat[s][i];
cost[i]=pay[s][i];
if(边不为无穷大) //无穷大代表此路不通 path[i] =-1,否则就在路径加入这个点
path[i]中加入点s
else
path[i]等于-1
}
数组vis[s]标记为1;//起始点标记
数组dis[s]标记为0;//自己到自己的花费cost = 0
数组cost[s]标记为0;
for(i=1 to n)
{
int k=s,u=maxn;//找出到s距离最短&没标记的点,作为中转点更新dis值
for(j=0 to n)
{
if(!vis没有被标记且dis最短路径没有u)
{
u=dis[j];
k=j;
}
}
数组vis[k]标记为1;//标记这个点
for(j=0;j<n;j++)
{
if(!vis[j]&&mat[k][j]!=maxn)
{
if(最短路径dis相同的话)
{
选择花费最少的,最小cost
}
else if(如果这个花费更加优)
{
那么把这个点加入,更新最优秀的路径
}
}
}
}
}
void print(int s,int t)
{
stack<int>q;
//从path里溯源t = path[t],返回上一个和t联通的路径,由后往前,把s~t路径放入队列里面,然后输出
while(t!=s)
{
入队t;
t=path[t];
}
入队t;
while(队列不为空)
{
cout<<q.top()<<" ";
移除队头元素;
}
}
2.1.2代码截图
2.1.3本题PTA提交列表说明。
2.2.题目2:7-4 公路村村通
2.2.1设计思路
void Prim()
{
MST={s};
while(1)
{
v=未收录顶点中dist最小者;
if(这样的v不存在)
break;
将v收录进MST:dist【v】=0;
for(v的每个邻接点w)
if(dist[w]!=0)
if(E<dist[w])
{
dist[w]=E;
parent[w]=v;
}
}
if(MST中收的顶点不到v个)
EEROR(“生成树不存在”);
}
2.2.2代码截图
2.2.3本题PTA提交列表说明。
2.3.题目3:7-3 六度空间
2.3.1设计思路
int bfs(int z)
{
int i, level,count;
int visited[10001] = { 0 };
int last = z;//记录每层的最后一个元素:该层压入之后弹出之前更新:last=temp;
int tail;//用于记录每层压入时的结点
queue<int>q;
将z入队;
visited[z]置为1,表示访问过;
while (队列不空)
{
z置为队头元素;
移除队头元素;
for (i=1 to v)
if (两点有边&&节点未被访问)
{
count++;
visited[i]置为1;
将i入队
tail = i;
}
if (last == z)//一层全部弹出,准备开始弹下一层:弹出的(x)=当前层最后一个元素(last)
{
level++;
last = tail;//一层全都压入完后,更新last
}
if (level == 6) break;
}
返回 count;
}
2.3.2代码截图
2.3.3本题PTA提交列表说明。
3、上机考试错题及处理办法
3.1.1截图错题代码
3.1.2 错的原因及处理方法
箭头那一处漏了一句dist[s]=0;在上面for循环找到节点之后,就该把s节点置为0,表示访问
3.2.1截图错题代码
3.2.2 错的原因及处理方法
箭头处的for循环语句中,i应该从1开始循环。