1. 程式人生 > >2017暑假訓練第四天

2017暑假訓練第四天

  今天上午複習了一下圖論中最小生成樹和並查集有關的題目,做了練習中兩個關於最小生成樹的題目,兩個題目都是標準的模板題,第一個題目順利通過,但第二個題由於cin的速度過慢,所以一開始並未順利ac,究於是否是演算法出了問題,我又用prim演算法敲了一次,結果也是未ac,最終換成scanf之後兩個程式碼均順利ac。雖然浪費了大量的時間,但對於程式碼的模板起到了一定的熟悉作用,下面總結一下兩種演算法:

  對於prim演算法:

  這個演算法的思路有點貪心的意味,大致思路是以一個點為起點,這個點所能到達的點進行一次檢索,然後取路徑權值最小的一個點為下一個點進行更新,一共更新n次,找到n個點,然後權值相加就是最小生成樹的最小路徑值和。

  這種演算法的模板是:

  需要三個陣列:

  int minn[101];//儲存到達的最小邊權

  bool fun[101];//儲存是否訪問過這個點

  int a[101][101];//儲存邊權(從i到j)

  memset (fun,0,sizeof(fun);

  memset (minn,0x7f,sizeof(minn);//把初始邊權變為一個很大的數字

  minn[1]=0;//以1為起點開始查詢

  for (i=1;i<=n;i++){

      x=0;

     for (j=1;j<=n;j++){

       if (!fun[j]&&minn[j]<minn[x]){//找下一個邊權較小的點

            x=j;

       }

    }

    fun[x]=1;//標記x為下一個起點

    for (j=1;j<=n;j++){

        if (!fun[j]&&minn[j]<a[x][j]){//更新可到達的邊權為最小值

             minn[j]=a[x][j];

        }

    }

  }

  這段程式碼結束後,minn中儲存的便是最小生成樹的所有邊的邊權。

  對於涉及到並查集查詢方案kusckal演算法,則是利用貪心和合並的原理,每次找邊權最小的邊,看看該邊連線的兩個點是否屬於同一個“祖宗”,也就是是否已經連通,如果是,則進行下一次查詢,如果不是,則合併兩個邊,邊權加入總的邊權中。一共尋找n-1次,得到一個最小生成樹。

  這種演算法的模板是:

  struct point {

   int s;

   int e;

   int v;

  }p[9901];//用結構體存邊

  fa[101];//用陣列存放每個點的“祖宗”

  int father(int x){

   if (fa[x]!=x)fa[x]=father(fa[x]);

   return fa[x];

 }//並查集專用找“祖宗”程式碼。。。

 void together(int x,int y){

  int f1=father(x);

  int f2=father(y);

  if (f1!=f2){

    fa[f1]=f2;

  }//"祖宗"的合併,表示其二者屬於同一個連通區域

  sort(p+1,p+m+1,cmp);

  for (i=1,x=0;i<=m;i++){

   if (father(p[i].x)!=father(p[i].y)){

       together(p[i].x,p[i].y); 

      total+=p[i].v;

      x++;

   }  

   if (x==n-1)break;

  }

  演算法結束後total存的便是最小生成樹的最小路徑邊權和。

  下午的比賽做的有些迷迷糊糊,近幾日光做搜尋了,導致一見到題就想搜,結果理解錯了題意,最後理解題意之後快速ac,雖然ac了,可還是浪費了大量的時間在一個假的題意上,可見快不是做題的目的, 理解了比什麼都快。

  明天的訓練決定開始對最短路徑演算法的複習,然後悉數開始做圖論的題。

相關推薦

2017暑假訓練

  今天上午複習了一下圖論中最小生成樹和並查集有關的題目,做了練習中兩個關於最小生成樹的題目,兩個題目都是標準的模板題,第一個題目順利通過,但第二個題由於cin的速度過慢,所以一開始並未順利ac,究於是否是演算法出了問題,我又用prim演算法敲了一次,結果也是未ac,最終換

2017暑假訓練

  今天的訓練繼續昨天的思路繼續看的單調佇列,通過例題加深了對單調佇列的理解。在下午的訓練中做出了兩道水題,一道是簡單的判斷題,就是一個等差數列,誰先沒糖果輸出誰的名字,另外一道題是把一個佇列的某一段重新排列,然後判斷排列後的原來某個位置的數是否還是它,這個題需要一點腦洞,

2017暑假訓練十三

  今天完成了所有的訓練題目,最後兩個題目都比較的棘手,所以比較浪費時間,第一個題題意極其複雜,但最後讓求的東西卻並不是多難,就是連續的矩陣求可以圍成的最大的矩陣的面積,但理解這個題的題意卻用了大量的時間,用了4個集合的形式表述。這個題的解法就是單調棧(到今天我才發現我們學

2017暑假訓練

  今天的訓練開始了二分和單調佇列的練習,由於練習中有以前的原題,憑藉著記憶,1a了所有的原題,而後完成了兩道單調佇列的題,感覺細節把握上還需要更加的準確,尤其是陣列滾動的狀態和初始化等等方面,簡單的看看課件,和自己實際的操作還是有一定的差距的,細節注意不到就會鑄就大的錯誤

2017暑假訓練十五

  既然不用做題了,就細細的理解一下知識點,決定學一點寫一點,寫點有用的東西。   首先是看了一下用樹狀陣列求逆序數,看了好多版本,有直接求算的,有用結構體存取,再排序後計算的,但是總體的思路都是一樣的,i-sum(i),用這個數減去之前輸入的比他小的數的個數,總的看了一下

2017暑假訓練十二

  今天的訓練主要完成了有關單調佇列的兩個題,一個是有關於最大的全1矩陣,這個題我一開始的思路是借用了以前所學過的一個有關求最大子矩陣和的dp題目的思路,將二維的矩陣壓縮成一維,然後求一維的最大子段和,依照這個思路,我的想法仍然是這樣合成,最後逐次對行建立單調佇列,依據單調

2017暑假訓練十八

  今天的訓練簡單的看了一下樹狀陣列的內容,然後打了一場比賽,超出預期的a出來兩道題,第三道題是一個很水的題,這個沒什麼說的,而第五題能出來的原因我認為是不懈的堅持,一開始連題意都看不懂,什麼cell,又是either否定詞,後來因為第四題遲遲出不來,我們便開始了推理性的試

2017暑假訓練三週週中總結

  這兩天簡單看了一下有關線段樹的題目,還是認為線段樹的題目十分的難想,主要是難想樹的含義以及樹下存的內容。   Billboard這個題目就是一道典型的這樣的題,題意就是貼海報,w*h的一塊板子,往上面1*w貼海報,儘量貼的高,高度相同,向左貼。   題目的思路就是用線段

2017暑假訓練第二十

  今天早上的訓練研究了一下線段樹求最大值的演算法,建樹方法方法大致與模板相同,多了一個有關最大值的內容:   tree[id].max=max(tree[2*id].tree[2*id+1]);   意思也很好理解,就是根節點的最大值等於左子區間和右子區間的最大值的較大者

每天學習點--------2017-09-26) 摘要: 常用的字符串方法閱讀全文

.cn cnblogs img src log nbsp png image http 每天學習點--------第四天(2017-09-26) 摘要: 常用的字符串方法閱讀全文

Java基礎複習 覆習訓練+Random、Math類、99乘法表

Random類 a.建立物件 Random rd = new Random(); b.呼叫方法 int num = rd.nextInt(x);//生成一個隨機整數 但是必須指定隨機整數的範圍,範圍是 0~x-1 擴充套件:       

2017-12-19python全棧9期第一節之昨日內容回顧與作業講解之公司HR輸入人員名單的小程式的用法append

#!/user/bin/python# -*- coding:utf-8 -*-li = ['zs','ls','ww','zl']while 1: username = input('>>>') if username.strip().upper() == 'Q':

2017-12-19python全棧9期第二節之列表的增刪查改之刪除的pop和del和remove和clear

Python全棧 python use 刪除 rem pri utf-8 int 返回 #!/user/bin/python# -*- coding:utf-8 -*-li = [‘zs‘,‘ls‘,‘ww‘,‘zl‘]# name = li.pop(1) #按索引位置刪除

2017-12-19python全棧9期第二節之列表的增刪查改之元祖是隻讀列表、可迴圈查詢、可切片、兒子不能改、孫子可以改

#!/user/bin/python# -*- coding:utf-8 -*-tu = ('zs','ls','ww',[1,2,3,4,5,'zxcvb'],'zl')print(tu[3])print(tu[0:4])for i in tu: print(i)tu[3][5] = tu[3][5]

2017-12-19python全棧9期三節之iterable可叠代對象join之字符串和列表轉換成字符串和range

轉換成 user 可叠代對象 字符串 for utf-8 ++ 對象 pri #!/user/bin/python# -*- coding:utf-8 -*-s = ‘zd‘s1 = ‘_‘.join(s)print(s1)li = [‘zs‘,‘ls‘,‘ww‘,‘zl‘

2017-12-19python全棧9期三節之iterable可迭代物件join之字串和列表轉換成字串和range

#!/user/bin/python# -*- coding:utf-8 -*-s = 'zd's1 = '_'.join(s)print(s1)li = ['zs','ls','ww','zl','張達']s = '+++++++'.join(li)print(s)for i in range(0,10):

2017暑假訓練第二十一

  今天的訓練繼續做了有關於樹狀陣列和線段樹的題目,這些題難度確實遠大於之前做的那些二分和圖論的題目。主要是樹狀陣列和線段樹是一種類似於可以處理區間問題的工具,這種工具可以大大節省區間運算的時間,但是也需要大量的題目擴充套件思路。今天做的第一個題是一個用樹狀陣列優化的dp題

沖刺

等待 需要 學習 進行 連接 引導 整理 服務 代碼 昨天做了什麽:昨天找大三的學長尋求數據源無果,然後又再百度上尋找爬蟲方法還是不行,最後等待著平方X的作者整理方法給我連接學校的數據庫。 今天做了什麽:拿到平方X的作者整理的方法之後,開始學習所給方法,通過接口,嘗試訪問學

Vue2 學習(Vue的生命周期)

函數 gen 為什麽 urn pad 指向 ret htm 編譯 .array p { counter-increment: longen; margin-left: 10px } .array p::before { content: counter(longen) ".

python

flag utf-8 循環 tin 輸出 並不是 電腦 isp 要求 今天是一個坎,在做三級菜單時卡住了,因為想要簡潔的代碼,就要用到遞歸函數,卡的不要不要的!不過最後在同學老師的提點幫助下,還是解決了! 作業要求: 三級菜單:1. 運行程序輸出第一級菜單2. 選擇一級菜單