DS博客作业06--图

1.本周学习总结
1.思维导图

1476709-20190601145618021-37939484.png

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代码截图

1476709-20190608205847548-455356157.png
1476709-20190608205858486-1860754115.png

2.1.3本题PTA提交列表说明。

1476709-20190609142906684-1630767311.png

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代码截图

1476709-20190608210038599-1293231761.png
1476709-20190608210047880-1945650594.png
1476709-20190608210115948-1435981642.png

2.2.3本题PTA提交列表说明。

1476709-20190609142825710-678974673.png

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代码截图

1476709-20190609140806034-1193283924.png
1476709-20190609140820786-543236282.png
1476709-20190609140831880-1913733901.png

2.3.3本题PTA提交列表说明。

1476709-20190609142740127-340550532.png

3、上机考试错题及处理办法
3.1.截图错题代码

3.1.1题目:6-1 jmu-ds-最短路径 (20 分)

给定一个有向图,规定源点为0,求源点0到其他顶点最短路径。
3.2 错的原因及处理方法

3.2.1

本题在上机考试时没有写

3.2.2 正确代码

1476709-20190609212555663-1454223552.png

转载于:https://www.cnblogs.com/2084624983yue/p/10959641.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值