1.学习总结(2分)

1.1图的思维导图


1.2 图结构学习体会
谈谈你对图结构中的几个经典算法学习体会。具体有:
深度遍历算法:它从图中某个结点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中的所有顶点都被访问到为止。
广度遍历算法:它是一个分层搜索的过程和二叉树的层次遍历十分相似,它也需要一个队列以保持遍历过的顶点顺序,以便按出队的顺序再去访问这些顶点的邻接顶点。
Prim算法:普里姆算法是一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。
Kruscal算法:克鲁斯卡尔算法是在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边。
Dijkstra算法:Dijkstra算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止
拓扑排序算法:将一个有向无环图进行排序进而得到一个有序的线性序列。

2.PTA实验作业(4分)

2.1 题目1:图着色问题

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

建图
for m=0 to n{
	for i=0 to v
		{
		输入颜色并插入s;
		num[i] = color;
		}
		
		if (颜色数不等于输入值k) {
			flag = 0;
		}
		else {
			判断是否符合条件,符合flag=1,不符合0;
		}
		flag不为0输出yes,否则no
	}

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



2.4 PTA提交列表说明。


编译错误:调用memset时没有使用头函数
部分正确:MAXV的值用了6-1的200,不够

2.1 题目2:六度空间

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

建图并从v=1开始遍历之
q.push(v)
while(队不空){
  将number置为队列头元素,删除队列头元素;
         for   i=0 to  i=N{
     若visited[i]==0且G[number][i]==1;
              将i进队,visited[i]=1,tail=i
                        }
}
   if(访问到该层的最后一个节点)
        层数++
        last = tail;
    if(层数==6)
              return 节点数

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


2.4 PTA提交列表说明。


编译错误:在头函数中加入了vs的头函数,还有一次是选择的C中用了c++的语法

2.1 题目3:排座位

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

       建图初始化并输入数据
      for i=0 to K
      if(是朋友)输出No problem
      flag=0判断有无共同;
      调用判断函数
      if(敌人)
            if(有共同) 输出OKBUT
            if(无共同) Noway
      if(不是朋友)
            if(有共同)  No problem
            if(无共同) OK

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

2.4 PTA提交列表说明。


段错误:MAXV太大
编译错误:没加头函数
部分正确:查询函数有点问题

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

本次题目集总分:310分

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

3.2 我的总分:200

本题评分规则:
(3)PTA总分在200--250分:2分(大部分做完2)

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

double a[11000];  
struct node{  
    int val;  
    node *lc;  
    node *rc;  
};  
node *create(){  
    node *p=new node;  
    p->lc=NULL;  
    p->rc=NULL;  
    return p;  
}  
void Build(node *&p,int ele){  
    if(p==NULL){  
        p=create();  
        p->val=ele;  
        return ;  
    }  
    if(p->val>=ele){  
        Build(p->rc,ele);  
    }  
    else{  
        Build(p->lc,ele);  
    }  
    return ;  
}  
   
    
queue<node *>Q;int n;  
  
int first=0;  
int judge(node *p){  
    if(p){  
        if(!first){  
            return 1;  
        }  
        else{  
            return 0;  
        }  
    }  
    else{  
        first=1;  
    }  
    return 1;  
}  
void solve(node *p){  
    Q.push(p);  
    int biao=0;  
    int flag=0;  
  
    while(!Q.empty()){  
        node *tm=Q.front();  
        Q.pop();  
        if(tm==NULL){  
            return ;  
        }  
        if(flag==0)flag=1;  
        else printf(" ");  
        printf("%d",tm->val);  
        if(tm->lc){  
            Q.push(tm->lc);  
        }  
        if(tm->rc){  
            Q.push(tm->rc);  
        }  
        if(!judge(tm->lc)){  
            biao=1;  
        }  
        if(!judge(tm->rc)){  
            biao=1;  
        }  
    }  
  
    if(biao==1){  
        puts("\nNO");  
    }  
    else{  
        puts("\nYES");  
    }  
}  
int main(){  
    cin>>n;  
    node *root=create();  
    root=NULL;  
    for(int i=0;i<n;i++){  
            int t;  
        scanf("%d",&t);  
        Build(root,t);  
    }  
   // mid(root);  
    solve(root);  
    return 0;  
}  


该题是通过一个排序二叉树去判断其是否是完全二叉树,首先要弄清楚完全二叉树的特点是:只允许最后一层有空缺结点且空缺在右边,即叶子结点只能在层次最大的两层上出现,对任一结点,如果其右子树的深度为j,则其左子树的深度必为j或j+1。 即度为1的点只有1个或0个。本题按照完全二叉树的特点就行编些,思路是:对于一颗完全二叉树采用广度优先遍历,从根节点开始,入队列,如果队列不为空,循环。遇到第一个没有左儿子或者右儿子的节点,设置标志位,如果之后再遇到有左/右儿子的节点,那么这不是一颗完全二叉树。这个方法需要遍历整棵树,复杂度为O(N),N为节点的总数。

posted @ 2018-06-17 22:22  林怡鹏  阅读(209)  评论(1编辑  收藏  举报