1.学习总结(2分)

1.1图的思维导图

图的存储结构--图的遍历---最小生成树--最短路径---拓扑排序、关键路径,这些知识点需要都梳理。

1.2 图结构学习体会

深度遍历算法

深度遍历我的做法是采用递归算法,用一个visited数组来记录遍历过得路径,最终得到整个图的路程,它的时间复杂度为o(n平方)

广度遍历算法

广度遍历是首先访问初始顶点,然后访问定点的所有领节点,以此类推,最终可以访问整个图。以邻接表为储存结构,需要使用一个队列、

Prim和Kruscal算法

这两个算法都是用来构建最小生成树的算法,两个算法的方式不同,Kruscal算法运用到排序方面的内容,可使算法的时间复杂度更小。

Dijkstra算法

此算法是用来寻找两点之间的最短路径,其中比较特殊的就是要更新顶点到其他点的路径,会随着顶点加入s数组而是,不在数组中的顶点与初始点的距离产生变化。

拓扑排序算法

在有向图中找一个拓扑排序的过程叫做拓扑排序。
其方法为,从有向图中找度为0的顶点并输出它,然后删除该顶点和该顶点所具有的有向边,在重复以上步骤即可。

2.PTA实验作业(4分)

2.1 题目1:题目名称 六度空间(30 分)

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

定义变量last=v,level=0,cnt=1,分别表示每层的最后一个数,层数,六层以内的个数,并进行初始化。
int visited[MAXV]来记录访问过得节点。 
让初始点进队
 while(队列不为空的时候){
      进行广度遍历
      在遍历中
	  if(!visit[i])在这个带你没有访问过是{
	  cnt++
	  让visit[i]=1,来代表此节点已经访问 
}
	  if(v等于last时)说明这一层已经访问完全{
	     level++
	     并更新last 
		 }
		直到level=6的时候 退出循环。 
 } 

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

请贴主要函数代码,一些操作函数代码不需要贴图。

2.4 PTA提交列表说明。

这次的错误主要是因为

我在初始化visit函数的时候,是从0-n-1;
而我之前建图的时候是从1-n导致错误。

2.1 题目1:题目名称 7-4 公路村村通(30 分)

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

这道题我是采用Prim算法。来得到最小生成树。
建完图后
建立两个数组low[MAXV],clost[MAXV],来记录U到V-U之间选择权值在最小的边。
for(i=0 to i<g.n){
	初始化low[i]的值和clost[i]=v的值。 
end for
for(i=0 to i<g.n){
	定义min=INF,min用来寻找最小边的权值。
	for(j=1toj<g.n){
		在(V-U)中寻找距离U最近的点
		并定义k来记录最近顶点的编号。 
	} 
	让k节点进入U数组中 
	判断图是否联通 if(min=INF)说明道路没有立联通 输出-1;
	节点k进入U数组后,
	图与剩下节点的距离就会改变
	因此
	for(j=0 to j=G.n){
		if(k节点到其他节点的距离更短) 修改low数组。 
	} 
} 
 

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

2.4 PTA提交列表说明。

这道题我是在dvc上调试好的,有以个错误是不知道如何在Prim算法中判断图是否联通,
后来军霖大佬告诉我说在寻找最小权值的for循环之后,判断min的值是否改变,如果出现min值没有改变的情况
就说明图是不通的。

2.1 题目1:题目名称 7-7 旅游规划(25 分)

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

本题使用迪克斯拉算法来寻找最短的路径
如果不同的路径的路程相同则考虑价格的多少即可

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

2.4 PTA提交列表说明。

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

本次题目集总分:310分

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

出现段错误的原因是空间太大,这题我是吧结构体给取消了,设置两个全局变量edges[MAXV][AXV]和money[MAXV][MAXV];
这样就解决了段错误的原因,但是我不知道为什么会这样,可能是结构体所占的内存很大吧。

3.2 我的总分:

本题评分规则:252

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

3.5 关键路径的算法:

(1)输入e条弧<j,k>,建立AOE-网的存储结构; 
(2)从源点v0出发,令ve[0]=0,按拓扑有序求其余各顶点的最早发生时间ve[i] (1≤i≤n-1)。如果得到的拓扑有序序列中顶点个数小于网中顶点数n,则说明网中存在环,不能求关键路径,算法终止;否则执行步骤(3)。
(3)从汇点vn出发,令vl[n-1]=ve[n-1],按逆拓扑有序求其余各顶点的最迟发生时间vl[i](n-2≥i≥0);
(4)根据各顶点的ve和vl值,求每条弧s的最早开始时间e(s)和最迟开始时间 l(s)。若某条弧满足条件e(s)=l(s),则为关键活动。 
Status TopologicalOrder(ALGraph G,Stack &T){  
//有向网G采用邻接表存储结构,求各顶点事件的最早发生时间ve(全局变量)。  
//T为拓扑序列顶点栈,s为零入度顶点栈。若G无回路,返回G的一拓扑序列,函数值为OK,否则ERROR。   
    FindInDegree(G,indegree);//对各顶点求入度indegree[0..vernum-1]  
    for(i=0;i<G.vexnum; ++i)     
    if(!indegree[i])Push(S,i) //建零入度顶点栈,s入度为0者进栈   
    InitStack(T); count=0;ve[0..G.vexnum-1]=0; //初始化   
    while(!StackEmpty(S)){ //j号顶点入T栈并计数  
        Pop(S,j); Push(T,j);++count;  
        for(p=G.vertices[j].firstarc;p;p=p->nextarc){  
            k=p—>adjvex; //对i号顶点的每个邻接点的入度减l  
            if(--indegree[k]==0)Push(S,k); //若入度减为0,则入栈  
            if(ve[j]+*(p->info)>ve[k] ) ve[k]=ve[j]+*(p->info);    
  
         }//for *(p->info)=dut(<j,k>)   
  
    }//while   
    if(count<G.vexnum) return ERROR; //该有向网有回路  
    else return OK;  
  
}//TopologicalOrder   
  
  
  
  
Status CriticalPath (ALGraph G){ //G为有向网,输出G的各项关键活动。  
    if(!TopologicalOrder(G,T)) return ERROR;    //初始化顶点事件的最迟发生时间   
    vl[0..G.vexnum-1]=ve[0..C.vexnum-1]; //按拓扑逆序求各顶点的vl值  
    while(!StackEmpty(T))  
        for( Pop(T, j), p=G.vertices[j].firstarc;p; p=p->nextarc){  
            k=p->adjvex; dut=*(p—>info); //dut<i,k>  
            if(vl[k]-dut<vl[j]) vl[j]=vl[k]-dut;  }//for  
    for(j=0;j<G.vexnum;++j) //求ee,el和关键活动  
        for(p=G.vertices[j];p;p=p->nextarc){  
            k=p->adjvex; dut=*(p—>info);ee=ve[j];el=v1[k]-dut;tag = (ee==e1) ? ‘*’ : ‘’;  
            printf(j,k,dut,ee,el,tag); //输出关键活动    
}   
}//CriticalPath   
posted @ 2018-06-17 21:44  z&jack  阅读(223)  评论(0编辑  收藏  举报