图
图
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.从效率上,十字链表可以直接查询节点的前驱和后继节点.
典型的以空间换时间.不过消耗的空间很少.
执行结果:
- #include<iostream>
- usingnamespace std;
- typedefchar VextexType;
- typedefint EdgeType;
- #defineVexNum 5
- structEdgeNode;
- structEdgeNode {
- VextexType HeadName;
- VextexType TailName;
- EdgeType weight;
- EdgeNode *VexOut;
- EdgeNode *VexIn;
- };
- typedefstruct
- {
- VextexType name;
- EdgeNode *VexOutlink;
- EdgeNode *VexInlink;
- }VexNode;
- VexNodeadjList[VexNum];
- voidcreatGraph()
- {
- VextexType vextemp;
- EdgeType edgetemp;
- //input n vextex
- for ( int i=0; i<VexNum ; ++i ){
- cin>>vextemp;
- adjList[i].name = vextemp;
- adjList[i].VexOutlink = NULL;
- adjList[i].VexInlink = NULL;
- }
- for ( int i=0; i<VexNum*VexNum; ++i ){
- cin>>edgetemp;
- if ( edgetemp==0 ){
- continue;
- }
- EdgeNode *pEdge = new EdgeNode;
- pEdge->HeadName =adjList[i/VexNum].name;
- pEdge->TailName =adjList[i%VexNum].name;
- pEdge->weight = edgetemp;
- pEdge->VexOut = adjList[i/VexNum].VexOutlink;
- if ( pEdge->VexOut ){
- while ( pEdge->VexOut->VexOut){
- pEdge->VexOut=pEdge->VexOut->VexOut;
- }
- pEdge->VexOut->VexOut =pEdge;
- pEdge->VexOut=NULL;
- } else {
- adjList[i/VexNum].VexOutlink =pEdge;
- pEdge->VexOut = NULL;
- }
- }
- for ( inti=0 ;i<VexNum ;++i ){
- EdgeNode **pInLink =&adjList[i].VexInlink;
- for ( int j=0; j<VexNum; ++j ){
- if ( i==j ){
- continue;
- }
- EdgeNode *p = adjList[j].VexOutlink;
- while ( p ){
- if ( p->TailName !=adjList[i].name ){
- p = p->VexOut;
- continue;
- }
- *pInLink = p;
- pInLink = &p->VexIn;
- p = p->VexOut;
- }
- }
- *pInLink = NULL;
- }
- }
- voiddestroyGrape()
- {
- for ( int i=0; i<VexNum ;++i ){
- EdgeNode *p = adjList[i].VexOutlink;
- EdgeNode *q;
- while ( p ){
- q = p;
- p = p->VexOut;
- delete q;
- }
- }
- }
- voidprintGrape()
- {
- for ( int i=0; i<VexNum; ++i ){
- cout<<adjList[i].name<<"-->";
- EdgeNode *p = adjList[i].VexOutlink;
- while ( p ){
- cout<<"("<<p->HeadName<<","<<p->TailName<<","<<p->weight<<")";
- p = p->VexOut;
- }
- cout<<endl;
- p = adjList[i].VexInlink;
- cout<<adjList[i].name<<"-->";
- while ( p ){
- cout<<"("<<p->HeadName<<","<<p->TailName<<","<<p->weight<<")";
- p = p->VexIn;
- }
- cout<<endl;
- }
- }
- int main()
- {
- creatGraph();
- printGrape();
- destroyGrape();
- }