博客作业06--图

1.学习总结(2分)

1.1图的思维导图

博客作业06--图_第1张图片

1.2 图结构学习体会

深度遍历算法

  • 深度遍历是一种递归的应用,用递归来实现

    广度遍历算法

  • 广度遍历类似于二叉树的层次遍历,用队列来实现

    Prim和Kruscal算法

  • 这两种算法都是用来求最小生成树的,Prim适用于邻接矩阵储存和较密的图,Kruscal算法适用于邻接表储存和较稀疏的图

    Dijkstra算法

  • Dijkstra算法是用来求最短路径的,适用于求邻接矩阵储存,不适用于求权值有负数的图

    拓扑排序算法

  • 拓扑排序可以用栈也可以用队列,通过在结构体新加一个变量表示入度来实现。

2.PTA实验作业(4分)

2.1 题目1:图着色问题

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

      输入顶点数a与边数v,颜色数e
      置flag的初值为0
      建图
     深度遍历
     输入待检查的颜色分配方案的个数n
     while(n-- ){
            for j=1 to 顶点数{
             输入颜色的分配方案,统计所用颜色总数sum
              }
         若统计的颜色总数sum!=题干的颜色数     
              flag=1
      }
         将颜色按深度遍历
          for i=0 to 顶点数{
                for j=0 to 顶点数{
                  若有相邻的颜色相同
                     flag=1
               }
             flag=1停止循环
      }
   如果flag=1 输出no 否则 输出yes

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

博客作业06--图_第2张图片

2.4 PTA提交列表说明。

博客作业06--图_第3张图片

  • 一开始创建函数那边忘记申请空间导致段错误
    博客作业06--图_第4张图片
  • 第二次因为深度遍历那边的循环变量错了又是段错误

2.1 题目2: 排座位

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

  定义变量result存放结果,count辅助判断结果
   输入M,N,count;
   创建图
   for 0到count{
        输入k1,k2;
       如果g.relation[k1][k2]==1      
             输出"No problem";
        else if(g.relation[k1][k2]==-1){
        广度遍历找有没有共同的朋友 即 result=BFS(g,k1,k2);
        如果(result==0)    
              输出 "No way";
        否则输出 "OK but...";
}
    else if(g.relation[k1][k2]==0)        输出"OK";
}

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

博客作业06--图_第5张图片

2.4 PTA提交列表说明。

博客作业06--图_第6张图片

  • 最大N的那个测试点过不去
    博客作业06--图_第7张图片
  • 一开始我以为是g.relation[k1][k2]的值错了,但是修改这个原本为-1的值以后就会导致所有答案错误,所以我现在也没有找出来问题在哪

2.1 题目3:六度空间

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

博客作业06--图_第8张图片

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

博客作业06--图_第9张图片

2.4 PTA提交列表说明。

博客作业06--图_第10张图片

  • 一开始用深度遍历,但是最后一个测试点没有正确,我也不知道为什么
    博客作业06--图_第11张图片
  • 后来改用广度遍历,最后一个测试点就运行超时了,大概是因为用了memset函数。后面加上了 flag[i] = 1;将flag置回初值就不会运行超时了
    博客作业06--图_第12张图片

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

3.1 PTA排名(截图带自己名字的排名)

博客作业06--图_第13张图片

3.2 我的总分:192

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

pta 7-4题公路村村通,在别人的博客里看到的写法

#include  
#include  
#include  
using namespace std;  
#define N 1005  
int f[N];  
/*树的母节点,例如节点1的母节点f[1]=2,那么2就是节点1的母节点*/  
struct edge  
{  
    int l,r,dis;  
    bool friend operator < (edge a,edge b)  
/*操作符重载,记得这种sort排序结构体数组的格式,因为没有深入学习*/  
    {  
        return a.dis>n>>m;  
    int i,j,k;  
    for(i=1;i<=m;i++)  
    {  
        cin>>e[i].l>>e[i].r>>e[i].dis;  
    }  
    for(i=1;i<=n;i++)  
    f[i]=i;
    sort(e,e+m);  
    for(i=1;i<=m;i++)  
    {  
        if(cnt==n-1) break;  
        int fa=sanda(e[i].l);  
        int fb=sanda(e[i].r);  
        if(fa==fb) continue;  
        //如果节点fa和fb在同一棵森林里面,就继续  
        sum+=e[i].dis;  
        f[fa]=f[fb];  
        cnt++;  
    }  
    if(cnt==n-1) cout<
  • 这题本来是Prime算法的简单应用,求出最小生成树即可,但是这个做法加了一个sanda函数来搜索母节点并且调整母节点,感觉这样的做法也很巧妙

你可能感兴趣的:(博客作业06--图)