DS博客作业06--图
1.本周学习总结
1.思维导图
2.谈谈你对图结构的认识及学习体会。
图结构与之前学的树结构一样都是非线性数据结构,但是图结构比树结构更加复杂,图结构中每一个元素都可以有零个或者多个前驱元素,也可以有零个或者多个后继元素。图常用的存储结构有邻接矩阵与邻接表。图的遍历分为广度遍历和深度遍历。深度遍历类似于树的先序遍历,是先序遍历的一种推广,简称为DFS。而广度遍历类似于树的层序遍历,是树的层序遍历的推广,简称BFS。求图的最小生成树一般用普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。求最短路径一般使用迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法。
2.PTA实验作业
2.1.题目1:7-3 六度空间 (30 分)
图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?
但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。
2.1.1设计思路(伪代码)
Graph *creat() //创建图
{
图的邻接矩阵构造算法
}
void dfs(Graph *g,int i) //深度遍历
{
for j=1;j<=g->v;j++
if g->a[i][j]==1 && visited[j]==0
dfs(g,j);
end if
end for
}
void dfs1(Graph *g)
{
for(i=1;i<=g->v;i++)
if(visited[i]==0)
dfs(g,i)
end for
end for
}
int main()
{
定义 int类型变量 flag 来记录图的着色是否符合要求
定义 Graph*类型指针 g
while(n--)
{
先定义flag=1,为着色符合要求的情况
定义整型数组b[501]={0},c[501],e[501]
for(i=1;i<=g->v;i++)
if(b[c[i]]==1)
sum++
end if
end for
if(sum!=z)
flag=0 //不符合
end if
for(i=0;i<k;i++)
for(j=0;j<k;j++)
if(g->a[d[i]][d[j]]==1 && e[i]==e[j])
flag=0 //不符合
break
end if
end for
if(flag==0)
break
end if
end for
}
}
2.1.2代码截图
2.1.3本题PTA提交列表说明。
2.2.题目2:7-1 图着色问题 (25 分)
图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?
但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。
2.2.1设计思路(伪代码)
本题用图的邻接矩阵存储结构,用图的广度遍历完成
void BFS(int id)
{
库函数创建整数型栈 Q
栈中插入 id
for(int deep=0;deep<6;deep++)
vector<int> v;
while(Q.size()>0)
{
int tmp=Q.front();
Q.pop();
v.push_back(tmp);
}
for(int i=0;i<v.size();i++)
int xx=v[i];
for(int j=1;j<=n;j++)
if(G[j][xx]==1 && vis[j]==0)
vis[j]=1;
cnt++;
Q.push(j);
end if
end for
end for
end for
}
2.2.2代码截图
2.2.3本题PTA提交列表说明。
2.3.题目3:7-4 公路村村通 (30 分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
2.3.1设计思路(伪代码)
void CreateGraph(int v,int e) //建图
{
邻接矩阵建图操作
}
int Prim(int v,int e) //Prim算法
{
定义整型变量 min,i,j,k;
i定义整型数组 lowcost[MAXVEX];
定义整型变量 cost=0;
lowcost[1]=0;
for i=2 to v
lowcost[i]=G[1][i]
end for
for i=2 to v
min=INF
j=1 k=0
while(j<=v)
if(lowcost[j]!=0&&lowcost[j]<min)
将lowcost[]数组最小的边赋值给min
用k记录该边所对应的顶点
end if
j++
end while
if(k==0)
return -1
end if
cost+=min
lowcost[k]=0
for j=2 to v
if(lowcost[j]!=0&&G[k][j]<lowcost[j])
lowcost[j]=G[k][j]
end if
end for
end for
}
2.3.2代码截图
2.3.3本题PTA提交列表说明。
3、上机考试错题及处理办法
3.1.截图错题代码
#######3.1.1题目:6-1 jmu-ds-最短路径 (20 分)
给定一个有向图,规定源点为0,求源点0到其他顶点最短路径。
3.2 错的原因及处理方法
#######3.2.1
本题在上机考试时没有写
#######3.2.2 正确代码