图

1.学习总结(2分)

1.1图的思维导图

1.2 图结构学习体会

1,掌握了图的相关概念,包括图、有向图、无向图、完全图、子图、连通图、度、入度、出度、简单回路和环等定义。

2,学会了使用图的储存结构去编写程序,包括邻接矩阵和邻接表等。

3,理解了图的基本运算,包括创建图、输出图、深度优先遍历、广度优先遍历等。

4,学会了最小生成树、最短路径、拓扑排序和关键路径等算法。

2.PTA实验作业

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

1、设计思路:

大致思路如下:

bj=0;///是用来标记已经查到不符合条件的边,即有边的两个顶点是同一种颜色;

sum=0;///用来记录该方案中出现的颜色种类;

每一轮方案都要将该 f 数组刷为0 ; ( f 数组是用来检查该种颜色是否是新出现的颜色)

如果bj不等于0,说明已经查到不符合条件的边没,如果颜色的种类已经超过k种,说明该方案也不行;

如果查到有不符合条件的边,或者方案中使用的颜色种类不是k中,说明该方案也不可行;

否则,则方案可行

2、 代码截图

3、PTA提交列表说明。

 

刚开始想用邻接表储存结构DFS算法去进行图的遍历去判断是否着色正确,

在DFS算法中的递归调用那一部分出了问题,

借鉴了同学的代码才写了出来。

在不使用图的基本运算前提下下去完成这道题目,算法也较为简单了很多。

经过借鉴同学的代码和在Dev中调试后,没有出什么错误。

题目2:7-2 排座位

1、设计思路

1,考虑到了并查集,将直接或者间接是朋友关系的元素加入集合。

2,若两人直接是敌对关系,但是两个人同属一个集合。说明符合题意的 (OK but...)这种情况 

3,剩下的几种情况直接判断即可 

2、 代码截图

 

3、PTA提交列表说明。

第一次在进行判断的时候,在判断条件里少了一个条件导致部分正确。

进行修改之后,发现在判断语句里只判断了两位宾客是否为朋友关系,没有考虑到敌对关系。

修改之后第二次发生了编译错误,

是自己的粗心大意在语句后少了分号。

修改之后正确了。

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

1、设计思路

使用了老师提供的求最小生成树的思路去完成这道题目。

大致思路:

以邻接矩阵进行存储 采用prim算法

2、 代码截图

 

3、PTA提交列表说明。

在老师提供了使用map的思路下,还是无法写出正确的代码。

在百度上搜索到了此种方法,在弄懂之后,上传到了PTA上。

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

 本次题目集总分:310分

3.1 PTA排名

 

3.2 我的总分:220分

4. 阅读代码

十字链表

在有向图中,邻接表是有缺陷的,关心了出度问题,要想知道入度,就必须遍历整个图,反之逆邻接表解决了入度却不能解决出度,那能否将邻接表与逆邻接表结合起来呢,答案是肯定的,于是就有了一种新的有向图的存储方法:十字链表法。

十字链表和链表存储图的比较:

1.存储空间上十字链表比链表要多.

2.从效率上,十字链表可以直接查询节点的前驱和后继节点.

典型的以空间换时间.不过消耗的空间很少.

执行结果:

  1. #include<iostream>  
  2. usingnamespace std;  
  3.    
  4. typedefchar VextexType;  
  5. typedefint  EdgeType;  
  6.    
  7. #defineVexNum 5  
  8. structEdgeNode;  
  9. structEdgeNode {  
  10.     VextexType HeadName;  
  11.     VextexType TailName;  
  12.     EdgeType  weight;  
  13.     EdgeNode  *VexOut;  
  14.     EdgeNode  *VexIn;  
  15. };  
  16.    
  17. typedefstruct  
  18. {  
  19.     VextexType name;  
  20.     EdgeNode  *VexOutlink;  
  21.     EdgeNode  *VexInlink;  
  22. }VexNode;  
  23.    
  24. VexNodeadjList[VexNum];  
  25.    
  26. voidcreatGraph()  
  27. {  
  28.     VextexType vextemp;  
  29.     EdgeType  edgetemp;  
  30.     //input n vextex  
  31.     for ( int i=0; i<VexNum ; ++i ){  
  32.         cin>>vextemp;  
  33.         adjList[i].name       = vextemp;  
  34.         adjList[i].VexOutlink = NULL;  
  35.         adjList[i].VexInlink  = NULL;  
  36.     }  
  37.     for ( int i=0; i<VexNum*VexNum; ++i ){  
  38.         cin>>edgetemp;  
  39.         if ( edgetemp==0 ){  
  40.             continue;  
  41.         }  
  42.    
  43.         EdgeNode *pEdge = new EdgeNode;  
  44.         pEdge->HeadName =adjList[i/VexNum].name;  
  45.         pEdge->TailName =adjList[i%VexNum].name;  
  46.         pEdge->weight   = edgetemp;  
  47.    
  48.         pEdge->VexOut   = adjList[i/VexNum].VexOutlink;  
  49.         if ( pEdge->VexOut ){  
  50.             while ( pEdge->VexOut->VexOut){  
  51.                 pEdge->VexOut=pEdge->VexOut->VexOut;  
  52.             }  
  53.             pEdge->VexOut->VexOut =pEdge;  
  54.             pEdge->VexOut=NULL;  
  55.         } else {  
  56.             adjList[i/VexNum].VexOutlink =pEdge;  
  57.             pEdge->VexOut = NULL;  
  58.         }  
  59.     }  
  60. for ( inti=0 ;i<VexNum ;++i ){  
  61.     EdgeNode **pInLink =&adjList[i].VexInlink;  
  62.     for ( int j=0; j<VexNum; ++j ){  
  63.         if ( i==j ){  
  64.             continue;  
  65.         }  
  66.         EdgeNode *p = adjList[j].VexOutlink;  
  67.         while ( p ){  
  68.             if ( p->TailName !=adjList[i].name ){  
  69.                 p = p->VexOut;  
  70.                 continue;  
  71.             }  
  72.             *pInLink = p;  
  73.             pInLink = &p->VexIn;  
  74.             p = p->VexOut;  
  75.         }  
  76.     }  
  77.     *pInLink = NULL;  
  78. }  
  79. }  
  80.    
  81. voiddestroyGrape()  
  82. {  
  83.     for ( int i=0; i<VexNum ;++i ){  
  84.         EdgeNode *p = adjList[i].VexOutlink;  
  85.         EdgeNode *q;  
  86.         while ( p ){  
  87.             q = p;  
  88.             p = p->VexOut;  
  89.             delete q;  
  90.         }  
  91.     }  
  92. }  
  93.    
  94. voidprintGrape()  
  95. {  
  96.     for ( int i=0; i<VexNum; ++i ){  
  97.        cout<<adjList[i].name<<"-->";  
  98.         EdgeNode *p = adjList[i].VexOutlink;  
  99.         while ( p ){  
  100.            cout<<"("<<p->HeadName<<","<<p->TailName<<","<<p->weight<<")";  
  101.             p = p->VexOut;  
  102.         }  
  103.         cout<<endl;  
  104.         p = adjList[i].VexInlink;  
  105.        cout<<adjList[i].name<<"-->";  
  106.         while ( p ){  
  107.            cout<<"("<<p->HeadName<<","<<p->TailName<<","<<p->weight<<")";  
  108.             p = p->VexIn;  
  109.         }  
  110.         cout<<endl;  
  111.     }  
  112. }  
  113.    
  114. int main()  
  115. {  
  116.     creatGraph();  
  117.     printGrape();  
  118.     destroyGrape();  
  119. }  
posted @ 2018-06-18 14:27  Doriso  阅读(211)  评论(0编辑  收藏  举报