一.学习总结

1.图的思维导图:

2.图结构学习体会:图是不同于顺序表和链表等线性存储结构的一种非线性存储结构,由顶点的有穷非空集合和顶点之间边的集合组成。图的概念,算法非常多,且较难理解,不注意就会混淆,必须多加复习来巩固对图的基本概念及算法代码的理解。

(1)几个经典算法学习体会

          深度遍历算法:算法采用递归方法实现,代码比较易于理解

          广度遍历算法:算法采用队列算法实现,代码比较易于理解

          Prim和Kruscal算法:Prim算法采用两个辅助数组lowcost【】和closest【】来存储相关信息,Kruscal算法在Prim算法基础上多一个辅助数组vset【】,两个算法代码都较难理解

          Dijkstra算法:Dijkstra算法的精髓是两个数组dist【】和path【】在每次加入顶点后的变化情况,算法代码比较难懂

          拓扑排序算法:拓扑排序的核心在于找入度为零的顶点,并将其出度删除,算法代码较好理解

二.PTA实验作业

题目一:7-1 图着色问题

(1)设计思路:直接用图的遍历,遍历的时候判断颜色是否相等。 

(2)代码截图:

 

(3)PTA提交列表说明:

1.情况考虑不全部导致部分错误

 

2.编译环境错误导致编译错误   

 

题目二:7-2 排座位

(1)设计思路:采用图的深度遍历判断给出的两个宾格的关系,并存储在两个辅助数组中,递归调用判断是否满足题意

(2)代码截图:

 

(3)PTA提交列表说明:

 

1.考虑情况不全导致部分错误

题目三:7-4 公路村村通

(1)设计思路:该代码为参考代码,采用Prim算法和函数调用来实现,子函数FindMin查找到最小的公路路径,子函数Cost找到最少的公路花费

(2)代码截图:

 #include <iostream> 
using namespace std; 
#define N_Max 1002 
#define M_Max 3006 
#define MaxValue 9999999 
 
typedef struct MGraph *PGraph; 
struct MGraph 

    int G[N_Max][N_Max]; 
    int Nv; 
    int Ne; 
    int Flag; 
}; 
 
PGraph CreateGraph(int N,int M) 

    PGraph Graph=new(MGraph); 
    Graph->Flag=0; 
    Graph->Nv=N; 
    Graph->Ne=M; 
    for (int i=1; i<=Graph->Nv; ++i) 
    { 
        for (int k=1; k<=Graph->Nv; ++k) 
        { 
            Graph->G[i][k]=MaxValue; 
            Graph->G[k][i]=MaxValue; 
        } 
         
    } 
    return Graph; 

 
int FindMin(int LowCost[],int n) 

    int j=0,k=0,MinCost=MaxValue; 
    for (k=1,j=1; j<=n; ++j) 
    { 
        if (LowCost[j]&&LowCost[j]<MinCost) 
        { 
            MinCost=LowCost[j]; 
            k=j; 
        } 
    } 
    if (k==1) 
    { 
        return 0; 
    }else 
    { 
        return k; 
    } 

 
void Prim(PGraph Graph,int Parent[]) 

    int LowCost[N_Max]; 
    for (int i=1; i<=Graph->Nv; ++i) 
    { 
        LowCost[i]=MaxValue; 
    } 
    int i,j,k; 
     
    for (i=2; i<=Graph->Nv; ++i) 
    { 
        LowCost[i]=Graph->G[1][i]; 
        Parent[i]=1; 
    } 
    LowCost[1]=0; 
    Parent[1]=-1; 
     
    for (i=2;i<=Graph->Nv; ++i) 
    { 
        k=FindMin(LowCost,Graph->Nv); 
        if (k) 
        { 
            LowCost[k]=0; 
            for (j=2; j<=Graph->Nv; ++j) 
            { 
                if (LowCost[j]&&Graph->G[k][j]<LowCost[j]) 
                { 
                    LowCost[j]=Graph->G[k][j]; 
                    Parent[j]=k; 
                } 
            } 
        }else 
        { 
            Graph->Flag=1; 
            break; 
        } 
    } 
     

 
PGraph BuildGraph(PGraph Graph) 

    int row=0,lie=0,weight=0; 
    for (int i=1; i<=Graph->Ne; ++i) 
    { 
        cin>>row>>lie>>weight; 
        Graph->G[row][lie]=weight; 
        Graph->G[lie][row]=weight; 
    } 
    return Graph; 

 
int Cost(int A[],PGraph Graph) 

    int temp=0,cost=0; 
    for (int i=2; i<=Graph->Nv; ++i) 
    { 
        temp=A[i]; 
        cost+=Graph->G[i][temp]; 
    } 
    return cost; 

 
int main(int argc, const char * argv[]) 

    //Input 
    int N=0,M=0,cost=0; 
    cin>>N>>M; 
    PGraph Graph=CreateGraph(N, M); 
    Graph=BuildGraph(Graph); 
     
    int Parent[N_Max]={0}; 
    Prim(Graph, Parent); 
    if (Graph->Flag==0) 
    { 
        cost=Cost(Parent,Graph); 
    } 
     
     
    if (N==1) 
    { 
        cout<<'0'; 
    } 
    else 
    { 
     
        if (Graph->Flag==0) 
        { 
            cout<<cost; 
        }else{ 
            cout<<"-1"; 
        } 
    } 
    return 0; 

(3)PTA提交列表说明:

 

1.编译环境错误导致编译错误     把编译环境换成正确的编译环境

三.本周题目集的PTA排名:

 

本次题目集总分:310分

(1)PTA排名:42

(2)我的总分:215分

四.阅读代码

 

posted on 2018-06-18 20:53  小柠  阅读(185)  评论(1编辑  收藏  举报

导航