洛谷P3366 模板 最小生成樹 題解

2022-05-24 08:30:11 字數 1294 閱讀 6251

最小生成樹模板題。

演算法思想:給邊按邊權從小到大排序,然後遍歷每一條邊,如果邊上的兩個點不在同乙個集合,則選擇這條邊,並將兩個點所在集合合併。直到選擇了 \(n-1\) 條邊。

實現**如下:

#include using namespace std;

const int maxn = 200200;

int n, m, f[5050], cnt, u[maxn], v[maxn], idx[maxn];

long long ans, w[maxn];

void init()

int func_find(int x)

void func_union(int x, int y)

bool cmp(int i, int j)

int main()

sort(idx, idx+m, cmp);

for (int k = 0; k < m; k ++)

}if (cnt < n-1) puts("orz");

cout << ans << endl;

return 0;

}

演算法思想:設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u-v中找到另一點b使得點b到v中任意一點的權值最小,此時將b點也加入集合v;以此類推,現在的集合v=,再從集合u-v中找到另一點c使得點c到v中任意一點的權值最小,此時將c點加入集合v,直至所有頂點全部被加入v,此時就構建出了一顆mst。因為有n個頂點,所以該mst就有n-1條邊,每一次向集合v中加入乙個點,就意味著找到一條mst的邊。

實現**如下:

#include using namespace std;

const int maxn = 5050;

#define inf (1<<29)

int n, m, dis[maxn];

bool vis[maxn];

struct node

node (int _v, int _w)

};vectorg[maxn];

void prim()

ans += dis[id];

vis[id] = true;

int sz = g[id].size();

for (int j = 0; j < sz; j ++)

}cout << ans << endl;

}int main()

prim();

return 0;

}

洛谷 P3366 模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出...

洛谷 P3366 模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi輸出格式 輸出包含乙個數,即最小...

洛谷 P3366 模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出...