\(一道裸題\)
\(最小生成樹有兩種演算法:prim \ 和\ kruskal.\)
\(prim:o(n^2)\)
\(kruskal:o(mlogm)\)
\(如何證明演算法正確(如何證明當前這條邊一定可以被選)\ ?\)
\(假設不選當前邊,最終得到了一棵樹,然後將這條邊加上,那麼必然形成乙個環,在這個環上,\\一定可以找出一條不小於當前邊的邊,那麼把當前邊替換,結果一定不會變差.\)
#include using namespace std;
#define io ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
inline int lowbit(int x)
#define ll long long
#define pb push_back
#define pii pair#define x first
#define y second
#define inf 0x3f3f3f3f
const int n = 110;
int n;
int w[n][n];
int dist[n];
bool st[n];
int prim()
return res;
}int main()
最小生成樹 Prim
include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...
最小生成樹 prim
演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...
最小生成樹 PRIM
這個是有關普利姆的演算法,從乙個點出發,找出與這個點相連的所有點的對應的權值最小的那個,然後再把這個點從集合中劃掉。模板如下 include include define inf 0xfffff define max 2005 using namespace std int map max max ...