1.学习总结(2分)

1.1图的思维导图

 

1.2 图结构学习体会

  • 深度遍历算法:这个遍历过程是个递归过程,以邻接矩阵为存储结构,调用DFS函数
  • 广度遍历算法:将图中所有和初始顶点v有路径相通的顶点都被访问,以邻接矩阵为存储结构
  • Prim和Kruscal算法:Prim算法是一种构造性算法,算法中有两重for循环,更适合稠密图求最小生成树;
  •                                   Kruskal算法是一种求带权无向图的最小生成树的构造性算法,按权值的递增次序选择合适的边来构造最小生成树,更适合稀疏图求最小生成树
  • Dijkstra算法:单源最短路径问题,

    利用dist和path求最短路径长度和最短路径

  • 拓扑排序算法:在一个有向图中找一个拓扑序列的过程称为拓扑排序

2.PTA实验作业(4分)


2.1 题目1:

7-1 图着色问题

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

 

 

 

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

 

2.4 PTA提交列表说明。

这道题中的代码用到了C++的函数,所有编译器应选择C++编译器。还有当s.size()!=k是,标签flag应赋值0。’

2.1 题目2:7-2 排座位

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

 

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

 

 

2.4 PTA提交列表说明。

同题目一,应选择C++编译器,还有在combine函数中,a和b的大小关系要讨论以及在不同的分支下应对其采取不同的赋值操作。

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

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

 

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

 

 

2.4 PTA提交列表说明。

 要注意不连通的情况,以及顶点的设置。

 

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

本次题目集总分:310分

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

 

3.2 我的总分:180分

本题评分规则:

1)PTA总分310分:3分(全部题目都做)
 (2)PTA总分在250分--310分:2.5分(大部分做完1)
 (3)PTA总分在200--250分:2分(大部分做完2)
 (4)PTA总分在150--200分:1.5分
 (5)PTA总分在60分-150分:1分  
 (6)PTA总分在60分以下:0分     

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

  1. #include <iostream>  
  2. using namespace std;  
  3. #define INF 32767  
  4. #define MaxVex 20  
  5. typedef enum {DG,DN,UDG,UDN}GraphKind;  
  6. bool path[MaxVex][MaxVex]={};  
  7. bool final[MaxVex];  
  8. int D[MaxVex]={0};  
  9. int d[MaxVex]={0};  
  10. struct ArcCell{  
  11.     int adj;  
  12.     int *info;  
  13. };  
  14.   
  15. struct Graph{  
  16.     int vexs[MaxVex];  
  17.     ArcCell arcs[MaxVex][MaxVex];  
  18.     int vexnum,arcnum;  
  19.     GraphKind kind;  
  20. };  
  21. int getmax(int *d,Graph a)  
  22. {  
  23.     int result=0;  
  24.     for(int i=0;i<a.vexnum;i++)  
  25.         if(result<d[i])result=d[i];  
  26.     return result;  
  27. }  
  28. int getmin(int *d,Graph a)  
  29. {  
  30.   
  31.     int result=d[0];  
  32.     int i,j;  
  33.     for(i=0;i<a.vexnum;i++)  
  34.         if(result>d[i]){result=d[i];j=i;}  
  35.     return j;  
  36.   
  37. }  
  38.       
  39. void input(Graph *graph)  
  40. {  
  41.     int n;  
  42.       
  43.     cout<<"请输入顶点个数";  
  44.     cin>>n;  
  45.     graph->vexnum=n;  
  46.     cout<<endl<<"请输入无向图的邻接矩阵,无穷时大请输入-1";  
  47.     for(int i=0;i<n;i++)  
  48.         for(int j=0;j<n;j++)  
  49.         {  
  50.             cout<<endl<<"arc["<<i<<"]["<<j<<"]=";  
  51.             cin>>graph->arcs[i][j].adj;  
  52.             if(graph->arcs[i][j].adj==-1)graph->arcs[i][j].adj=INF;  
  53.             /*if(i==j){graph->arcs[i][j].adj=0;cout<<endl<<"arc["<<i<<"]["<<j<<"]=0";} 
  54.             else if(graph->arcs[j][i].adj>0&&graph->arcs[j][i].adj<=INF){graph->arcs[i][j].adj=graph->arcs[j][i].adj;cout<<endl<<"arc["<<i<<"]["<<j<<"]="<<graph->arcs[j][i].adj;} 
  55.             else {cout<<endl<<"arc["<<i<<"]["<<j<<"]=";cin>>graph->arcs[i][j].adj;} 
  56.             if(graph->arcs[i][j].adj==-1)graph->arcs[i][j].adj=INF; 
  57.             */  
  58.           
  59.         }  
  60.   
  61. }  
  62.    
  63. void Dijkstra(Graph G,int v0)  
  64. {  
  65.     int min,v,w;  
  66.     for(v=0;v<G.vexnum;++v){  
  67.         final[v]=false; D[v]=G.arcs[v0][v].adj;  
  68.         for(int w=0;w<G.vexnum;++w) path[v][w]=false;  
  69.         if(D[v]<INF){path[v][v0]=true;path[v][v]=true;}  
  70.     }//for  
  71.     D[v0]=0; final[v0]=true;  
  72.     for(int i=1;i<G.vexnum;++i){  
  73.         min=INF;  
  74.         for(w=0;w<G.vexnum;++w)  
  75.             if(!final[w])  
  76.                 if(D[w]<min){v=w;min=D[w];}  
  77.         final[v]=true;  
  78.         for(w=0;w<G.vexnum;++w)  
  79.             if(  
  80.                 !final[w]&&(min+G.arcs[v][w].adj<D[w])){  
  81.                     D[w]=min+G.arcs[v][w].adj;  
  82.                     for(int j=0;j<MaxVex;j++)path[w][j]=path[v][j];  
  83.                     path[w][w]=true;  
  84.             }//if  
  85.     }//for  
  86.   
  87.   
  88. }//dij  
  89.   
  90. void shortpath(Graph a)  
  91. {  
  92.     int result;  
  93.     for(int i=0;i<a.vexnum;i++)  
  94.     {  
  95.         Dijkstra(a,i);  
  96.         d[i]=getmax(D,a);//D[i]为始点到第i个点的最短路径   
  97.         //d[i]为始点为i时到其他各点最短路径中的最长路径;  
  98.     }  
  99.     result=getmin(d,a);  
  100.     Dijkstra(a,result);//getmin(d)为结果,医院位置  
  101.     for(int j=0;j<a.vexnum;j++)  
  102.     {  
  103.     cout<<endl<<"从医院(点"<<result+1<<")到村庄(点"<<j+1<<")最短距离为"<<D[j]<<"线路为";  
  104.     int x=0;  
  105.     for(int i=0;i<a.vexnum;i++)  
  106.     {  
  107.         if(path[j][i]==true)  
  108.             {  
  109.                 x++;  
  110.                 if(x>1)cout<<"->";  
  111.                 cout<<i+1;  
  112.         }  
  113.     }  
  114.     }  
  115.       
  116. }  
  117. void main()  
  118. {  
  119.     Graph a;  
  120.     input(&a);  
  121.     shortpath(a);  
  122. }  
posted on 2018-06-18 15:46  HHH,  阅读(252)  评论(1编辑  收藏  举报