1.学习总结

1.1图的思维导图

 

1.2 图结构学习体会

图:所有的图无非就是顶点和边构成的,有向的的就叫有向图,无向的就叫无向图。

遍历算法有深度遍历算法和广度遍历算法,两种算法都非常的巧妙,尤其是在代码上,根据不同的算法,有时候能解决不同的问题。

普里姆算法和克鲁斯卡尔算法:解决最小生成树的两种算法,普里姆的代码量多但是理解起来比较容易,克鲁斯卡尔算法代码量少,可理解起来比较麻烦吧。

狄克斯特拉算法和弗洛伊德算法:两种计算最短路径的算法,都挺容易理解的,就是在弗洛伊德算法可能会比较优越。

拓扑排序之关键路径:关键路径就是路径中最大权值的那一条,找是不太好找,但容易看出来,

2.PTA实验作业


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

1.2 设计思路

使用图遍历,然后每次遍历的时候判断颜色是否相同,只有当颜色的个数等于k时或者是符合那个不相邻条件时才可以。

遇到的问题就是,我不知道怎么才能让vis数组全部都为false,这时候用到了memset函数,memset(vis, false, sizeof(vis));使用该函数后解决了这个问题

1.3 代码截图

 

 

 

 

1.4 PTA提交列表说明

 

就是那个vis数组无法全部弄成false,用数组全部替换的时候,替换错了,一直不对,然后百度了memset函数。


2.1 题目2:7-2 排座位

2.2 设计思路

之中遇到朋友而又敌对的情况被我忽略了,这关系本来是比较麻烦的,后来加入a_r和b_r判断就比较简单了。

2.3 代码截图

 

2.4 PTA提交列表说明

第一次出现错误我以为是在最大N上出现错误,后来在dev上运行之后,发现题目给出的一种结果我没有用到,所以我在经过改正之后就对了。算是个比较小的错误。

3.1 题目3:7-3六度空间

3.2 设计思路

我觉得这题的设计思路会比较简单一点,就遍历一下。然后找到判断是否符合结论,且这个结论满足所需要的6个关系就可以了。

3.3 代码截图

 

 

 

3.4 PTA提交列表说明

 

 一开始把MAXV调到10001,然后段错误,多种错误是我count一开始的初值不小心赋为1,导致整个不对,第二个段错误是把MAXV调到1000,第三次部分正确是我把MAXV调到了100。最后还是没有全对,我觉得很奇怪,因为我只是把MAXV调高了,为什么会出现段错误,而且题目也要求要调到最大。

 

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

 

 

4. 阅读代码

天梯地图
本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线;一条是最短距离的路线。题目保证对任意的查询请求,地图上都至少存在一条可达路线。

 分析:用两个Dijkstra + DFS。一个求最快路径(如果相同求路径的那条),一个求最短路径(如果相同求结点数最小的那条)~~~求最快路径可以直接在Dijkstra里面求前驱结点Timepre数组~~~求最短路径因为要求结点数最小的那条,所以要用dispre的二维数组存储所有结点的最短路径,然后用DFS求出满足条件的结点数最小的那条~~~~
注意:
1.一开始最后一个测试用例“答案错误”,后来发现是自己在求最短路径(第二个答案distance)的时候忘记了temppath每一次深搜结束后的pop_back();

2.如果直接使用DFS的话,会导致最后一个测试用例“运行超时”~~~

 
    1. #include <cstdio>  
    2. #include <algorithm>  
    3. #include <vector>  
    4. using namespace std;  
    5. const int inf = 999999999;  
    6. int dis[510], Time[510], e[510][510], w[510][510], Timepre[510], weight[510];  
    7. bool visit[510];  
    8. vector<int> Timepath, dispath, temppath, dispre[510];  
    9. int st, fin, minnode = inf;  
    10. void dfsTimepath(int v) {  
    11.     Timepath.push_back(v);  
    12.     if(v == st) {  
    13.         return ;  
    14.     }  
    15.     dfsTimepath(Timepre[v]);  
    16. }  
    17.   
    18. void dfsdispath(int v) {  
    19.     temppath.push_back(v);  
    20.     if(v == st) {  
    21.         if(temppath.size() < minnode) {  
    22.             minnode = temppath.size();  
    23.             dispath = temppath;  
    24.         }  
    25.         temppath.pop_back();  
    26.         return ;  
    27.     }  
    28.     for(int i = 0; i < dispre[v].size(); i++) {  
    29.         dfsdispath(dispre[v][i]);  
    30.     }  
    31.     temppath.pop_back();  
    32. }  
    33. int main() {  
    34.     fill(dis, dis + 510, inf);  
    35.     fill(Time, Time + 510, inf);  
    36.     fill(weight, weight + 510, inf);  
    37.     fill(e[0], e[0] + 510 * 510, inf);  
    38.     fill(w[0], w[0] + 510 * 510, inf);  
    39.     int n, m;  
    40.     scanf("%d %d", &n, &m);  
    41.     int a, b, flag, len, t;  
    42.     for(int i = 0; i < m; i++) {  
    43.         scanf("%d %d %d %d %d", &a, &b, &flag, &len, &t);  
    44.         e[a][b] = len;  
    45.         w[a][b] = t;  
    46.         if(flag != 1) {  
    47.             e[b][a] = len;  
    48.             w[b][a] = t;  
    49.         }  
    50.     }  
    51.     scanf("%d %d", &st, &fin);  
    52.   
    53.     Time[st] = 0;  
    54.     for(int i = 0; i < n; i++) {  
    55.         Timepre[i] = i;  
    56.     }  
    57.     for(int i = 0; i < n; i++) {  
    58.         int u = -1, minn = inf;  
    59.         for(int j = 0; j < n; j++) {  
    60.             if(visit[j] == false && Time[j] < minn) {  
    61.                 u = j;  
    62.                 minn = Time[j];  
    63.             }  
    64.         }  
    65.         if(u == -1) break;  
    66.         visit[u] = true;  
    67.         for(int v = 0; v < n; v++) {  
    68.             if(visit[v] == false && w[u][v] != inf) {  
    69.                 if(w[u][v] + Time[u] < Time[v]) {  
    70.                     Time[v] = w[u][v] + Time[u];  
    71.                     Timepre[v] = u;  
    72.                     weight[v] = weight[u] + e[u][v];  
    73.                 } else if(w[u][v] + Time[u] == Time[v] && weight[v] > weight[u] + e[u][v]) {  
    74.                     weight[v] = weight[u] + e[u][v];  
    75.                     Timepre[v] = u;  
    76.                 }  
    77.             }  
    78.         }  
    79.     }  
    80.     dfsTimepath(fin);  
    81.   
    82.     fill(visit, visit + 510, false);  
    83.     dis[st] = 0;  
    84.     for(int i = 0; i < n; i++) {  
    85.         int u = -1, minn = inf;  
    86.         for(int j = 0; j < n; j++) {  
    87.             if(visit[j] == false && minn > dis[j]) {  
    88.                 u = j;  
    89.                 minn = dis[j];  
    90.             }  
    91.         }  
    92.         if(u == -1) break;  
    93.         visit[u] = true;  
    94.         for(int v = 0; v < n; v++) {  
    95.             if(visit[v] == false && e[u][v] != inf) {  
    96.                 if(e[u][v] + dis[u] < dis[v]) {  
    97.                     dis[v] = e[u][v] + dis[u];  
    98.                     dispre[v].clear();  
    99.                     dispre[v].push_back(u);  
    100.                 } else if(e[u][v] + dis[u] == dis[v]) {  
    101.                     dispre[v].push_back(u);  
    102.                 }  
    103.             }  
    104.         }  
    105.     }  
    106.     dfsdispath(fin);  
    107.     printf("Time = %d", Time[fin]);  
    108.     if(dispath == Timepath) {  
    109.         printf("; Distance = %d: ", dis[fin]);  
    110.     } else {  
    111.         printf(": ");  
    112.         for(int i = Timepath.size() - 1; i >= 0; i--) {  
    113.             printf("%d", Timepath[i]);  
    114.             if(i != 0) printf(" => ");  
    115.         }  
    116.         printf("\n");  
    117.         printf("Distance = %d: ", dis[fin]);  
    118.     }  
    119.     for(int i = dispath.size() - 1; i >= 0; i--) {  
    120.         printf("%d", dispath[i]);  
    121.         if(i != 0) printf(" => ");  
    122.     }  
    123.     return 0;  
    124. }  
posted @ 2018-06-18 00:18  每当每时每刻M  阅读(142)  评论(0编辑  收藏  举报