DS博客作业06--图

1.本周学习总结

1.1思维导图

1.2体会

图的存储结构相对于线性表和树来说更为复杂,更加灵活。在解决有关图的问题上,比起自己摸索,还是掌握已有的高效算法来的实际。什么题目适合哪种图存储结构,用哪种算法比较简单,这都是在做题前要认真思考的。很多时候,没有用好方法容易让简单的问题复杂化。而在后续的学习中,我们利用STL的基础设施,就可以很快的搭建Graph。

2.PTA实验作业

2.1题目一:六度空间

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

2.1.1设计思路

BFS函数
{
定义数组visited并初始化为0;
定义last=x,level=0,tail;
定义i,j;
定义整型队列q;
将x入队;
visited[x]=1;
while 队不为空
      x等于队头;出队;
      for j=1 to j=n
            if visited[j]等于0 且a[x][j]==1
                  count++;
                  tail等于j;
                  visited[j]等于1;
                  将j入队;
if x等于last
      last++;
      last等于tail;
if level等于6
      结束循环;
}
main函数
{
定义a,b;
定义i;
输入n,m;
for i=1 to m
      输入a,b;
      a[b][c]=1;
      a[c][b]=1;
for i=1 to n
      count=1;
      BFS(i);
      输出i;
      输出count;
return 0;

}

2.1.2代码截图



2.1.3本题PTA提交列表说明

  • Q1:原本用到邻接矩阵做这道题,想的太复杂了,导致写出来很乱。
  • A1:用一个全局变量a的二维数组,再用BFS遍历,过程就简单多了。

2.2题目二:图着色问题

图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?
但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。

2.2.1设计思路

main函数
{
定义邻接表G;
int V,E,K;
int N;
输入 V,E,K;
创建邻接表CreateAdj(G,V,E);
输入N;
for i=1 to N
      IsTrue(G,K)
return 0;
}
IsTrue函数
{
定义邻接表结点p;
定义set<int> s;
定义i,flag=0;
定义整型数组a并初始化0;
for i=1 to G->n
      输入a[i];
      s.insert(a[i]);
if s.size()!=k //若颜色数量不对
      flag=1;
else
      for i=1 to G->n
            p=G->adjlist[i].firstarc;
      while p不为NULL
            if a[p->adjvex]等于a[i]
                  flag=1;
                  结束循环;
            p=p->nextarc;
if flag等于0
      输出“yes”;
else
      输出“no”;

}

2.2.2代码截图




2.2.3本题PTA提交列表说明

  • Q1:多种错误
  • A1:刚开始写的时候想用数字来记录颜色数,后来发现不大可行,百度了其他代码,学着他们用了set,方便了许多。
  • Q2:最大图时运行错误
  • A2:把MAXV由500改为501就对了

2.3题目三:公路村村通

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

2.3.1设计思路

findmin函数
{
定义minn=4556,index=1;
定义i;
for i=1 to N
      if dist[i]不等于0且minn大于dist[i]
            minn等于dist[i];
            index等于i;
return index;
}
Prim函数
{
int cnt=1,cost=0;
int v;
for i=1 to N
      parent[i]等于s;
      dist[i] 等于c[i];
parent[s]等于-1;
dist[s]等于0;
while
      v=findmin();
      if(v==-1)结束循环;
      cost+=dist[v];
      cnt++;
      dist[v]=0;
      for i=1 to N
            if dist[i]不等于0且c[v][i]小于dist[i]
                  dist[i]等于c[v][i];
                  parent[i]等于v;
if(cnt等于N)输出cost;
else 输出-1;

}

2.3.2代码截图




2.3.3本题PTA提交列表说明

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

题目:拓扑排序

给定一个有向图,求其拓扑序列,若有环路,输出error!

3.1截图错题代码


3.2错的原因及处理方法到

  • 1.刚开始测试点1出现了答案错误,检查后发现是在输出函数时的循环条件写错了,记录结点数的k应该从0开始到G->n才对。
  • 2.在提交时,忘记把测试时的*改回空格,导致答案错误。
posted @ 2019-06-02 15:34  chianun  阅读(212)  评论(0编辑  收藏  举报