1. 程式人生 > 其它 >P3366 【模板】最小生成樹

P3366 【模板】最小生成樹

題目連結 https://www.luogu.com.cn/problem/P3366

你,作為一個模板題,我真的要恨恨地誇你幾句 :)

點捏的真好,WA了N遍,不僅讓我明白了題目的小細節,更讓我明白了一個人生道理:條條道路通羅馬

                                           TuT


Prim演算法:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 long long n,m;//n個點,m個邊
 5 long long x,y,z;//輸入起點、終點、邊權值
 6 long long cnt;//
記錄邊數 7 long long sum;//輸出和 8 int book[5010];//標記陣列 9 long long dis[200010];//記錄距離樹的距離最短路程 10 long long MAX=99999;//邊界值 11 int maps[5010][5010];//存圖 12 13 void Prim() 14 { 15 book[1]=1;//標記1已經被訪問 16 17 for(register long long i=1;i<=n-1;i++) //因為1已經訪問過,所以迴圈n-1次 18 { 19 int min=MAX; 20 int minIndex=0
; 21 //尋找離樹最近的點 22 for(register long long j=1;j<=n;j++) 23 { 24 if(book[j]==0&&dis[j]<min)//j沒有被訪問過,且i到j有邊連線 25 { 26 min=dis[j]; 27 minIndex=j; 28 } 29 } 30 31 book[minIndex]=1;//標記此點已被訪問
32 sum+=dis[minIndex]; 33 cnt++; 34 //如果不能聯通所有點 35 if(min==MAX) break; 36 37 for(register long long j=1; j<=n; j++) 38 { 39 //如果這點沒有被訪問過,而且這個點到任意一點的距離比現在到樹的距離近那麼更近 40 if(book[j]==0&&maps[minIndex][j]<dis[j]) 41 dis[j]=maps[minIndex][j];//就將更小值放入dis陣列,即更新當前最小生成樹到其他點的最小距離 42 } 43 } 44 } 45 46 int main() 47 { 48 std::ios::sync_with_stdio(false); 49 cin>>n>>m; 50 51 //初始化maps,除了自己到自己的點為0,其餘為邊界值 52 for(register long long i=1; i<=n; i++) 53 { 54 for(register int j=1; j<=n; j++) 55 { 56 if(i==j) maps[i][j]=0; 57 else maps[i][j]=MAX; 58 } 59 } 60 61 //輸入無向圖 62 for(register long long i=1; i<=m; i++) 63 { 64 cin>>x>>y>>z; 65 if(z<maps[x][y])//條條大路通羅馬 66 { //無向圖,對稱矩陣 67 maps[x][y]=z; 68 maps[y][x]=z; 69 } 70 } 71 72 //初始化距離陣列,預設從頂點1開始計算,並把1能夠到達的點放進dis陣列 73 for(register long long i=1; i<=n; i++) 74 { 75 dis[i]=maps[1][i]; 76 } 77 78 Prim(); 79 //判斷是否能生成 80 if(cnt>=n-1) cout<<sum<<endl; 81 else cout<<"orz"; 82 return 0; 83 }

Kruskal演算法:

等著,今晚就更!嗎的!