乙個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。 [1] 最小生成樹可以用kruskal(克魯斯卡爾)演算法或prim(普里姆)演算法求出。
prim在稠密圖中比kruskal優,在稀疏圖中比kruskal劣。
kruskal:
#include #include #include #define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e3 + 5;
struct edge
e[maxn]; //存圖
bool cmp (struct edge a, struct edge b) //排序
int f[maxn];
void init (int n) //初始化
}int getf (int x) //找根
int merge(int x, int y) //合併,核心**
return 0;
}int main()
sort(e + 1, e + n + 1, cmp); //從1開始排序,都+1
int sum = 0;
for (int i = 1; i <= n; i++)
}cout << sum << endl;
return 0;
}
prim:
#include #include #include #define inf 0x3f3f3f3f
using namespace std;
const int max=1e3+5;
int map[max][max],dis[max],book[max];
int main()
} int a,b,c;
for(int i=1;i<=m;i++) //存圖 }
for(int i=1;i<=n;i++) //距離初始
int count=0,sum=0,min,u;
book[1]=1;
count++;
while(countmap[u][v])
}} cout
}
2013寒假ACM集訓 最小生成樹
普里姆演算法 稠密圖 克魯斯卡爾演算法 稀疏圖 1.prime 演算法 貪心 集合加點 2.kruskal演算法 並查集 加邊 思想是加 點,在邊比較多的情況下,用prime。思路 先找 任意一點到其他的點的 最短距離,再找 這個點和剛才的點 到其他的點的最短距離,依次重複 最小生成樹 prime模...
第七天 樹的遍歷
最近真是各種事情纏繞在一起,一直不敢揮霍時間刷題,慚愧慚愧。像鍊錶一樣,在練習樹的演算法之前先開一章,打好基礎,主要是遍歷的方法 前中後序遍歷,非遞迴版本,廣度 層次 遍歷。ps 深度遍歷暫缺,另外後序的非遞迴版本copy別人的方法需要鞏固。偷個懶,一股腦全部貼上來 include include ...
第七章(6) 最小生成樹
由minispantree prim 可知prim演算法的時間複雜度為o n n n為頂點數 與網中的邊數無關,因此使用於求邊稠密的網的最小生成樹。而kruskal演算法恰恰相反,它的時間複雜度為o e log e e為網中邊的數目 它比較適合求邊稀疏的網的最小生成樹。include stdio.h...