Highways POJ 1751 最小生成樹

2022-06-13 19:30:16 字數 1228 閱讀 4314

這道題的邏輯比較簡單,明白了思路之後,結合並查集模板,我花了兩個小時不到的時間寫程式,卻又花了兩個小時去調bug!真是個悲傷的故事啊。

演算法是這樣的:計算每兩個頂點(我設定了包括自環,其實包不包括沒太大區別)之間的連線長度,以及記錄端點,設為邊,設計edge這一結構體存。一共有n*(n+1)/2條邊。然後輸入已修好的鐵路圖,用並查集將每兩個點相連線。然後,將所有邊按照長度公升序排序,從第乙個邊開始,遍歷每一條邊,如果它的兩端點沒有在同乙個集合內,將它們加入同乙個集合(這是並查集的操作),然後輸出這兩個端點,遍歷下一條邊。如果在同乙個集合內,就跳過。直到所有邊都處理完。

bug出在以下幾個方面:

1.初始化並查集失敗,沒有把並查集值初始化為-1。因為犯了乙個老錯誤,在輸入乙個變數前使用了它。這次因為被我封裝成了函式,所以錯誤很隱蔽,用cout調了好久才發現。

2.兩個打錯了的變數名。乙個是在二重迴圈中,應該為j++,我打成了i++,這個我調了半個多小時吧;另乙個就爽了,是在計算笛卡爾座標系上的點間距時,我把第二個的結構體下標標成了第乙個的,調了我乙個半小時還多。

3.由於我標記的城鎮是從0n-1的,但是題目中輸入和輸出都是從1n的,所以我得改我的輸入或者輸出。由於改輸入牽扯到很多下標的變化,出現問題的機率大,所以我設計成了將輸出+1,就是對應城市。

這道題帶我學了學並查集和kruskal演算法求最小生成樹,還好吧,除了bug太噁心。

//#include #include #include #include #include #define n 1005

using namespace std;

vector> pii; //儲存每個點的x,y座標,點集

struct edge; //定義邊的資料結構

vectorve; //邊集

int parent[n],n,m; //parent是並查集的儲存陣列,某個點i的父節點為parent[i]

double len(int a,int b); //計算兩點間距

bool cmp(edge a,edge b)

// for (int i=0;i=0;res=parent[res]);

//cout<<"now res=\t"

return res;

}bool same(int a,int b)

Highways poj1751最小生成樹

題意 有n個點,已知各點座標,距離為權值,求最小生成樹的邊 但是這個最小生成樹的m條邊是已經確定的了,所以可以讓已知邊的權值為0 在prim演算法中改一下就行 include include include include include include define n 1100 define i...

1751 分解因數

總時間限制 1000ms 記憶體限制 65536kb 描述 給出乙個正整數a,要求分解成若干個正整數的乘積,即a a1 a2 a3 an,並且1 a1 a2 a3 an,問這樣的分解的種數有多少。注意到a a也是一種分解。輸入第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括乙個正...

1751 區間覆蓋問題

time limit 1000 ms memory limit 65536 kib problem description 設x1 x2 xn 是實直線上的n 個點。用固定長度的閉區間覆蓋這n 個點,至少需要多少個這樣的固定長度閉區間?對於給定的實直線上的n個點和閉區間的長度k,設計解此問題的有效演...