DS博客做業06--圖

目錄

1.本週學習總結

1.1思惟導圖

1.2談談你對樹結構的認識及學習體會

本章學習了圖結構的的相關知識,相對於樹各有各的難點,樹更多的遞歸,圖更相似於一個二維結構,圖屬於複雜的非線性數據結構,在實際應用中有不少問題能夠用圖來描述,好比網絡,在圖形結構中,每一個元素能夠有零個或者多個前驅元素,也能夠有零個或者多個後繼元素,元素之間的關係是多對多的,相對於以前的學習,圖的基本術語更加複雜。經常使用的圖的存儲結構有鄰接矩陣和鄰接表,鄰接矩陣就是用二維數組來表示,而鄰接表則是定義三個結構體組成的圖結構。鄰接矩陣更使用於稠密圖,鄰接表更適用於稀疏圖。

2. PTA實驗做業

2.1 六度空間

2.1.1 設計思路

算法思路

  • 對於每一個結點進行廣度優先搜索
  • 搜索過程當中累計訪問的結點數
  • 須要記錄層數,僅計算6層之內的結點數算法

    僞代碼

    int BFS(vertex V)
      {
          visited[V]=true;
          count=1;
          level=0;
          last=v;
          while(隊列不爲空)
          {
                  x=出隊列;
                  for(x的每一個鄰接點w)
              {
                  if沒有被訪問
                  {
                      visited[w]=true;
                      w進隊列;
                      count++;
                      tail=w;
                  }
              if(訪問到該層最後一個元素)
              {
                  level++;
                  last=tail;
              }
              if(層數level=6)break;
          }
          返回count
      }

    2.1.2 代碼截圖

2.1.3 本題PTA提交說明

2.2 修改道路

2.2.1 設計思路

算法思路

其實就是公路村村通的進一步複雜題,這裏給的是二維數組輸入因此輸入方式要用雙重for循環,而後將值做爲公路的花費,運用最小生成樹這裏把訪問過的設置爲-1,已經建好的路且未被訪問花費設置爲0便可

僞代碼

將各個公路長度輸入g[max][max];
    輸入公路(x,y)並將其置爲0;
    定義cost數組;
    for(遍歷全部城市)
    {
        更改全部城市到起始城市1的花費;
    }
    起始城市1的花費cost[1]=-1;
    定義sum記錄總花費置爲0;
    for(遍歷n-1次,把剩下的城市都加入)
    {
        每次循環min重置32768,K=-1;
        for(遍歷全部城市)
        {
            用if語句在沒有訪問過的城市找出最小花費;
            同時k記錄最小花費的城市;
        }
        if(存在最小花費的城市)
        {
            sum+=找到的最小花費;
            cost[k]=-1以訪問過;
            for(訪問全部城市)
            {
                修改cost數組;
             }
    }
    輸出sum;

2.2.2 代碼截圖

2.1.3 本題PTA提交說明


  • 前一張是公路村村通的提交列表,由於是在公路村村通的代碼上修改因此很容易就經過了,公路村村通題中老是有一個最大NM,過不了,也沒辦法測試,思路貌似也是對的,最後重寫過了,到最後也不清楚哪裏沒寫好。。。
  • 編譯錯誤由於vs貌似過大的二維數組會溢出,把棧容量修改便可,或者放到全局變量具體爲何也不是很清楚。。。數組

    2.3 圖着色

2.3.1 設計思路

算法分析

定義三個數組edges來記錄邊,color記錄各個頂點的顏色,利用vis判斷顏色數量,由於每行順次給出V個頂點的顏色(第i個數字表示第i個頂點的顏色)因此能夠只用判斷每次輸入的時候標號比他小的全部的直接聯通的點兩點間的顏色。

僞代碼

for循環初始化圖
    輸入n;
    for(i=0到i<n)
    {
        初始化flag,num爲0;
        初始化vis數組爲0;
        for(遍歷全部頂點)
        {
            輸入color[j];
            if(該顏色沒有出現過)
            {
                vis該顏色置爲1;
                num++;
            ]
            if(flag爲0同時顏色數量沒有超出限制)
            {
                for(遍歷標號比他小的全部的直接聯通的點)
                {
                    if(出現相同顏色)flag=1;
                }
            }
            if(出現相同顏色或者顏色過多)輸出No;
            else輸出Yes;
    }

2.3.2 代碼截圖

2.3.3 本題PTA提交說明


  • 這裏flag出錯,不能加上當時是想着,只要出現鄰接同顏色就退出循環,可是後面還要輸入就會出現問題
  • 編譯錯誤由於memset在vs中不用加入頭文件string.h,memset(void *s,int ch,size_t n);用於初始化

3.上機考試錯題

錯題一:

錯題二:

錯題緣由

錯了這兩題緣由一個是時間確實不夠,只能把特殊狀況輸出,再者就是熟練度不夠其餘題目浪費了不少時間,由於devc指針指不出來也是很難受。
相關文章
相關標籤/搜索